Perl

Поделись знанием:
Перейти к: навигация, поиск
Perl
Семантика:

мультипарадигмальный: императивный, объектно-ориентированный, функциональный

Тип исполнения:

интерпретатор

Появился в:

1987

Автор:

Ларри Уолл

Расширение файлов:

.pl, .pm, .cgi

Система типов:

слабая динамическая

Испытал влияние:

Си, AWK, Shell, Sed, Лисп

Повлиял на:

Ruby, PHP, Groovy

Лицензия:

Artistic License или GNU GPL

Сайт:

[www.perl.org/ l.org]

Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language — «практический язык для извлечения данных и составления отчётов»[1]. Первоначально аббревиатура состояла из пяти символов и в таком виде в точности совпадала с английским словом pearl («жемчужина»). Но затем стало известно, что такой язык существует (см. PEARL (англ.)), и букву «a» убрали. Символом языка Perl является верблюд — не слишком красивое, но очень выносливое животное, способное выполнять тяжёлую работу.

Основной особенностью языка считаются его богатые возможности для работы с текстом, в том числе работа с регулярными выражениями, встроенная в синтаксис. Перл унаследовал много свойств от языков Си, AWK, скриптовых языков командных оболочек UNIX.

Perl также знаменит огромной коллекцией дополнительных модулей CPAN, находящейся по адресу www.cpan.org.





Обзор

Perl — язык программирования общего назначения, который был первоначально создан для манипуляций с текстом, но на данный момент используется для выполнения широкого спектра задач, включая системное администрирование, веб-разработку, сетевое программирование, игры, биоинформатику, разработку графических пользовательских интерфейсов.

Язык можно охарактеризовать скорее как практичный (лёгкость в использовании, эффективность, полнота), чем красивый (элегантность, минималистичность)[2]. Главными достоинствами языка являются поддержка различных парадигм (процедурный, объектно-ориентированный и функциональный стили программирования), контроль за памятью (без сборщика мусора, основанного на циклах), встроенная поддержка обработки текста, а также большая коллекция модулей сторонних разработчиков.

Согласно Ларри Уоллу, у Perl есть два девиза. Первый — «Есть больше одного способа это сделать» («There’s more than one way to do it»), известный также под аббревиатурой TMTOWTDI. Второй слоган — «Простые вещи должны оставаться простыми, а сложные — стать выполнимыми» («Easy things should be easy and hard things should be possible»).

Особенности

Общая структура Perl в общих чертах ведёт своё начало от языка Си. Perl — процедурный по своей природе, имеет переменные, выражения присваивания, блоки кода, отделяемые фигурными скобками, управляющие структуры и функции.

Perl также заимствует ряд свойств из языков программирования командных оболочек UNIX. Все переменные маркируются ведущими знаками, которые точно выражают тип данных переменной в этом контексте (например, скаляр, массив, хеш). Важно, что эти знаки позволяют переменным быть интерполированным в строках. Perl обладает множеством встроенных функций, которые обеспечивают инструментарий, часто используемый для программирования оболочки, например сортировку или вызов системных служб.

Perl заимствует массивы из Лиспа, регулярные выражения из AWK и sed, из AWK также позаимствованы хеши («ассоциативные массивы»). Регулярные выражения облегчают выполнение многих задач по парсингу, обработке текста и манипуляций с данными.

Perl 5 добавил поддержку сложных типов данных, [en.wikipedia.org/wiki/First-class_function первоклассных функций] (замыкание как значение) и объектную модель. В последнюю входят ссылки, пакеты, выполнение методов от класса, переменные с лексическим объявлением области видимости, а также директивы компилятора (например, strict). Главнейшим усовершенствованием, представленным в Perl 5, стала возможность помещать код в «пакеты» (package) в качестве модулей для повторного использования. Ларри Уолл позже заметил, что «Весь замысел модульной системы Perl 5 сводился к поощрению роста культуры Perl, а не строчек кода»[3].

Все версии Perl выполняют автоматическую типизацию данных и автоматический контроль над памятью. Интерпретатор знает тип и запросы памяти каждого объекта программы, он распределяет и освобождает память, производя подсчёт ссылок. Перевод одного типа данных в другой — например, числа в строку — происходит автоматически во время исполнения, невозможные для выполнения переводы типов данных приводят к фатальной ошибке.

Работа в Windows

Пользователи Microsoft Windows обычно используют дистрибутивы с уже скомпилированными бинарными файлами, такие, как ActivePerl или Strawberry Perl[en], так как компиляция Perl из исходных кодов в этой ОС — не самая простая задача. Задачу может облегчить Cygwin.

История

Первые версии

Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys[4]. Версия 1.0 была выпущена и анонсирована в новостной группе comp.sources.misc 18 декабря 1987 года[5] как «„замена“ для awk и sed».

Perl 2 был выпущен в 1988 году. Основным нововведением в нём был переработанный механизм регулярных выражений. Perl 3, выпущенный в 1989 году, получил возможность обрабатывать потоки двоичных данных.

Изначально, единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена книга «Programming Perl» (известная многим программистам как «Верблюжья книга» (Camel Book) из-за изображения на обложке), которая, де-факто, стала стандартом языка. В то же самое время, версия языка была «поднята» до 4‑й — не столько чтобы указать на значительные изменения, сколько чтобы обозначить, что эта версия языка документирована книгой.

Ранний Perl 5

Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году. В этот момент Ларри Уолл забросил Perl 4 и начал работу над Perl 5. Разработка Perl 5 была начата в 1994 году. В то же время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5[6].

Perl 5.000 был выпущен 17 октября 1994 года.[7] Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (my $var_name) и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день.

Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 года и устранила обнаружившиеся проблемы с безопасностью.

Одно из важнейших событий в истории Perl 5 случилось за пределами собственно языка и было следствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Comprehensive Perl Archive Network — «всеобъемлющая сеть архивов Perl»), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент сеть насчитывает более 25 000 модулей, созданных более чем 8000 программистами[8].

Perl 5.004 был выпущен 15 мая 1997 года и содержал, кроме всего прочего, пакет UNIVERSAL, который давал языку основной объект, от которого автоматически происходили все классы. Была также включена возможность запрашивать версию модулей. В дополнение к этому Perl стал поддерживать Microsoft Windows, а также ряд других операционных систем.

Perl 5.005 увидел свет 22 июня 1998 года. Этот релиз включал в себя несколько улучшений процессора регулярных выражений, новые перехваты в бэкенд с помощью модулей B::*, оператор кавычек qr// для регулярных выражений, большой выбор других новых модулей, а также поддержку ряда операционных систем, в частности, BeOS.

C 2000 по наше время

Perl 5.6 был выпущен 22 марта 2000 года. Главные изменения включали поддержку 64-битных систем, представление строк в стандарте Юникод, поддержку больших файлов (файлы больше 2 Гб) и ключевое слово our[9][10]. Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиваться нечётные номера, стабильным версиям — чётные.

В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал 361 документ RFC (Request for Comments — «запрос комментариев»), которые были использованы в разработке Perl 6. В 2001 году[11] была начата работа над окончательным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве сводки всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка.

Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого времени получал ежегодное обновление. Последняя версия Perl 5.8, под номером 5.8.9, увидела свет 14 декабря 2008 года. Perl 5.8 улучшил поддержку Юникода, добавил новую реализацию ввода-вывода, добавил поддержку многопоточности, увеличил числовую точность и добавил несколько новых модулей[12].

В 2004 году началась работа над Синопсисом (Synopsis) — первоначально задуманном как ряд документов, подводящих итоги окончательного документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Отриус Тан начала работу над Pugs[en] — интерпретатором Perl 6, написанном на Haskell[13]. Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году.

18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~»[14][15].

Примерно в это же время всерьёз началась разработка новой реализации Perl 6, известной как Rakudo Perl[en], разработанной в связке с виртуальной машиной Parrot. С ноября 2009 года Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной реализацией Perl 6.

Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперёд.

12 апреля 2010 года Perl 5.12.0 был представлен общественности. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение «проблемы 2038 года» (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2[16]. 7 сентября 2010 года был выпущен Perl 5.12.2, а 21 января 2011 — Perl 5.12.3. Эти выпуски содержат обновление модулей, а также некоторые изменения в документации[17][18]. Версия 5.12.4 выпущена 20 июня 2011. Последняя версия этой ветви, 5.12.5, выпущена 10 ноября 2012.

14 мая 2011 выпущен Perl 5.14. Поддержка JSON стала встроенной, начиная с версии 5.14.2. Последняя версия этой ветви, 5.14.4, выпущена 10 марта 2013.

20 мая 2012 выпущен Perl 5.16. Значимым новшеством является возможность указать нужную версию Perl, которую надо эмулировать, позволяя пользователям обновить Perl, но сохранить работоспособность старых скриптов, которые иначе стали бы несовместимыми с новой версией[19]. Ядро Perl 5.16 поддерживает Unicode 6.1[19].

18 мая 2013 выпущен Perl 5.18. Значимые нововведения включают новые зацепки dtrace, лексические функции, увеличение числа включенных в ядро функций, пересмотр реализации хешей из соображений безопасности, поддержка Unicode 6.2[20].

Выпуск версии 5.20 ожидается 20 мая 2014.

Сопутствующие решения

Некоторые наблюдатели приписывают выходу Perl 5.10 запуск движения Modern Perl[21][22]. В частности, эта фраза описывает стиль разработки, подразумевающий использование CPAN, использование преимуществ последних разработок на языке, а также требовательность к высокому качеству кода[23].

В конце 2012 и в 2013 запущены несколько проектов по альтернативной реализации Perl 5: Perl5 in Perl6 (Rakudo Perl team)[24], moe (Стивен Литл с друзьями)[25], p2[26] (Perl11 team under Reini Urban), а также gperl (goccy)[27].

Perl 6

С 2000 года идёт разработка новой (6-й) версии языка. В отличие от предыдущих версий, разработчики планируют создать чётко определённый стандарт языка. В настоящее время существуют экспериментальные компиляторы Perl 6, но продолжается дальнейшее обсуждение новых правил.

Синтаксис языка Perl

Синтаксис Perl имеет много общего с синтаксисом языков Си, AWK, sed и Bourne shell.

Первая строка исходного кода может начинаться с «#!/Путь/к/Perl [-ключи]» — что указывает системе путь к интерпретатору Perl для выполнения программы в UNIX-системах и выполнения их на веб-сервере (см. также: Шебанг (Unix)).

Пример программы

Простейшая программа «Hello, world!» выглядит следующим образом:

#!/usr/bin/perl
print "Hello, world!\n";

либо для CGI:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, world!";

либо используя один из post modern web-framework

use Mojolicious::Lite;
get '/' => {text => 'Hello World!'};
app->start;

либо используя PSGI спецификацию

my $app = sub {
    return [200, ['Content-Type' => 'text/plain'], ["hello, world\n"]];
}

Дозапись в строку.

$x = 5;
$x .= 0;
print $x; #50

А вот так можно напечатать число гугол.

print 1, 0 x 100;

Типы данных

Основные типы данных: скаляр, массив, хеш-таблица, функция, [en.wikipedia.org/wiki/Filehandle указание на файл], запись таблицы символов. Переменные разных типов отличаются знаком, который стоит перед именем переменной:

Тип Символ Пример Описание
Скаляр $ $foo единичное значение; может быть числом, строкой, указанием на файл, а также ссылкой.
Массив @ @foo Упорядоченная коллекция скаляров.
Хеш-таблица % %foo Коллекция из пар строка-скаляр; строки называются ключами, а скаляры — значениями. Синоним — ассоциативный массив.
Файловый дескриптор < > $foo или FOO Представление открытого файла или другой цели, открытой для чтения и/или записи.
Функция & &foo Отрезок кода, который принимает аргументы, исполняет действия и возвращает значения.
Запись таблицы символов * *foo Запись таблицы символов для всех типов с именем 'foo'.

Скаляр

Скалярные переменные используются для хранения одиночных значений. Они могут содержать числа, строки и ссылки на другие объекты. Перед именем скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной переменной не фиксирован (в отличие от, например, языка Си) и определяется динамически в зависимости от контекста. Например,

$x = 10; # число
$y = $x + 1; # используем $x как число…
$z = $x . 'string'; # … а теперь — как строку
$ref = \$x;  # $ref является указателем на $x
$$ref = 10; # $x содержит значение 10

Строковые данные должны быть помещены в кавычки. Perl использует два вида кавычек — одиночные и двойные. Помещение строки в двойные кавычки позволяет именам переменных, содержащимся в строке, автоматически заменить собою название переменных. Заключение строк в одиночные кавычки предотвращает такое поведение:

## Пример интерполяции переменных в двойных кавычках

$pi             = 3.141592654;
$var1           = 'Значение Pi - $pi\n';  
print $var1;                                                 # Значение Pi - $pi\n
$var2           = "Значение Pi - $pi\n";
print $var2;                                                 # Значение Pi - 3.141592654

Для включения двойных кавычек в строку, которая была помещена в двойные кавычки, следует использовать отмену знака — \". Для включения одинарных кавычек в строку из одинарных кавычек — \'. Для удобства работы со строками, содержащими много знаков кавычек внутри, Perl позволяет использовать альтернативные способы закавычивания. Альтернативная форма использует любую пару знаков, помещённых после буквы q (имитирует поведение одинарных кавычек) или qq (имитирует поведение двойных кавычек):

## Пример использования альтернативных кавычек

$pi       = 3.141592654;
$link1    = q{<a href="ru.wikipedia.org/wiki/Pi">$pi</a>};
print $link1;                                              # <a href="ru.wikipedia.org/wiki/Pi">$pi</a>
$link2    = qq{<a href="ru.wikipedia.org/wiki/Pi">$pi</a>};
print $link2;                                              # <a href="ru.wikipedia.org/wiki/Pi">3.141592654</a>

Ещё один тип кавычек в Perl — обратные кавычки. В них помещаются программы операционной системы, вывод которых может быть передан интерпретатору Perl. Выполнение программ всегда заканчиваются символом новой строки — \n:

## Пример использования обратных кавычек для исполнения команд UNIX

$space		= `du -s -k /usr/local/bin`;
print $space;                                   # 6264	/usr/local/bin

$sysuptime	= `uptime`;	
print $sysuptime;                               # 2:24  up 1 day,  9:05, 1 user, load averages: 0.26 0.32 0.33

Массив

Массив является упорядоченным списком скаляров. Каждый элемент массива имеет порядковый индекс, с помощью которого к нему можно получить доступ. Нумерация элементов начинается с нуля, то есть первый элемент списка имеет индекс 0. Перед именем переменной-массива необходимо ставить знак '@', а для доступа к определенному элементу массива использовать знак '$', так как отдельный элемент массива является скаляром. Многомерные массивы можно смоделировать, помещая в список ссылки на другие списки.

@array = (1,2,3,4); # записали в массив @array четыре элемента
print $array[2];    # напечатать третий элемент
print @array[2,3];  # напечатать третий и четвёртый элемент.
# Здесь используется @, так как результат операции среза массива тоже является массивом.

Хеш-таблица

  • Хеш-таблица представляет собой ассоциативный массив, позволяющий ассоциировать строку (называемую «ключом») со скаляром (значение). Строка называется ключом, а скаляр в хеш-таблице значением. Перед именем переменной-списка необходимо ставить знак процента '%', а для доступа к определенному элементу массива необходимо ставить знак '$'.

Хеш-таблицу можно инициализировать массивом или списком, состоящим из неограниченного числа последовательностей (ключ, значение).

%hash = (
            cat => 'kitten',  # здесь => - это так называемая "длинная запятая", в этом примере
            dog => 'puppy',   # по функции полностью аналогичная обыкновенной "," за исключением 
            cow => 'calf'     # того, что литералы слева неявно заключаются в кавычки
        );
print $hash{'cat'}; #Напечатает kitten
print join("-", keys %hash) ; # Вывод всех ключей. Напечатает cat-dog-cow 
print join("-", values %hash) ; # Вывод всех значений. Напечатает kitten-puppy-calf
print join("-", %hash) ; # Напечатает cat-kitten-cow-calf-dog-puppy, так как в списковом контексте хэш автоматически
# разворачивается в список (ключ, значение). Так как ключи в хэше не сортируются,
# пары каждый раз будут выводиться в произвольном порядке.

Функция

  • Функция представляет собой фрагмент исполняемого кода. Функция всегда возвращает какое-либо значение. Если возвращаемое значение явно не указано оператором return, возвращается последнее вычисленное значение. Если в функции используется return без параметров, то в зависимости от контекста вызова функции возвращается неопределённое значение undef, пустой список или вообще ничего.
sub printTwo{
 print 2;
}

sub three{
 3;
}

$s = \&three;
print &$s; #Напечатает 3

$s = \&printTwo; # Запишем в скаляр $s ссылку на функцию - через эту ссылку она будет вызвана в следующей строке.
print &$s; #Напечатает 21. `2` в коде функции, а `1` как значение, возвращаемое функцией printTwo
print &printTwo #То же самое

Константа

  • Константа представляет собой неизменяемое значение. Константа не является встроенным типом языка и эмулируется при помощи функций. Предпочтительно задавать константы с помощью стандартного модуля constant, чтобы в будущем не зависеть от возможных изменений в реализации констант. Использование:
use constant MY => 2;
print MY;

Запись таблицы символов

  • Запись таблицы символов (typeglob) — специальный тип, в котором хранятся ссылки на все переменные других типов с таким названием, а также на символы, которые часто использует для хранения файловый дескриптор, представляющих собой указатель на файл, устройство или PIPE канал, открытые для записи, чтения или для записи и чтения.

Использование:

$s = readline *STDIN; #Читаем одну строку из дескриптора STDIN (стандартный поток ввода); скалярный контекст.
@values = <FILE>; #Читаем все строчки из некоторого открытого и связанного с дескриптором FILE файла; списковый контекст.
print STDOUT $s; #Печатаем в STDOUT (стандартный поток вывода)

Более информативный пример, в котором typeglob используется для передачи файлового дескриптора в функцию:

my $file = 'file.txt'; #имя файла, который читаем
open FH, $file; #открываем файл
my $text = _parseFile(*FH); #передаем файловый дескриптор в функцию
print $text;
close FH; #обязательно закрываем файловый дескриптор
sub _parseFile
{
	my $fh = shift; #получаем файловый дескриптор
	my $text = join('',<$fh>);#построчно читаем из файлового дескриптора, в строку и помещаем в переменную $text
	return $text;
}

В последних версиях Perl появилась возможность хранить файловые дескрипторы в скалярах, и в новых программах предпочтительно пользоваться именно этим способом.

Также таблицы символов используются для связи двух имён переменной с одним значением в памяти, создавая синонимы, которые могут быть использованы для доступа и модификации значения точно также как и оригинальное имя. Эта возможность является основой системы загружаемых модулей, классов и объектов в Perl.

Классы и объекты

Объект в Perl представляет собой просто ссылку, связанную с определённым классом (пакетом). Для связи используется функция bless. Подпрограммы такого связанного пакета являются методами и получают ссылку в качестве первого аргумента.

Специальный синтаксис для конструкторов отсутствует, используется подпрограмма пакета, возвращающая ссылку, связанную с этим пакетом.

Также существуют множество расширений для системы ООП, позволяющих менять синтаксис и использовать синтаксический сахар, в числе которых стоит назвать cpan-модуль Moose и его облегчённую версию Moo[28]. Moose используется многими проектами и крупными компаниями, такими как BBC или Cisco[29].

Регулярные выражения

Важной частью Perl являются регулярные выражения. Благодаря этому Perl хорошо подходит для обработки текстов. Бо́льшая часть работы с регулярными выражениями производится при помощи операторов =~, m// и s///.

Оператор m// используется для проверки на совпадение. В простейшем случае результат выражения $x =~ m/abc/ будет истинным тогда и только тогда, когда строка $x будет соответствовать регулярному выражению abc. Например:

Пример Значение
$x =~ /abc/ Строка $x содержит (под)строку «abc». Начальная буква «m» оператора при использовании // может быть опущена.
$x =~ m/a(.{1,3})c/ Строка $x содержит букву «a», затем от одного до трёх любых символов кроме символа перевода строки «\n», и затем букву «c».
$x =~ m{^p(erl|ugs)$}i Строка $x строго равна «perl» или «pugs» без учёта регистра. Так же, вместо // регулярное выражение окружено в {}.

Поиск и замена выполняются при помощи оператора s///. Конструкция $x =~ s/abc/def/; заменит первое вхождение регулярного выражения abc на строку def.

Пример Значение
$x =~ s/abc/def/g; Все вхождения (на что указывает флаг /g — global) подстроки «abc» в $x будут заменены на «def».
$x =~ s/a(.{1,3})c/!$1!/; Первое вхождение в $x буквы «a», затем от одного до трех любых символов кроме символа перевода строки «\n», и затем буквы «c» будет заменено на эти символы между «a» и «c», окружённые «!». Например, «syntactic» станет «synt!cti!».
$x =~ s{^p(erl|ugs)}{"P" . lc $1}ieg; Здесь показан пример использования модификатора /e, указывающего на то, что вместо строки замены будет написан код, результат выполнения которого надо использовать. Все вхождения «perl» или «pugs» в любом регистре будут заменены на «Perl» и «Pugs», соответственно.

С появлением динамических регулярных выражений (??{ код Perl }) и конструкции для включения в регулярное выражение исполняемого кода Perl (?{ код Perl }) возможности по поиску и замене стали практически безграничными. К примеру, стал возможен поиск конструкций произвольного уровня вложенности.

Регулярные выражения Perl настолько популярны, что они включены напрямую в другие языки, такие как PHP и JavaScript, а также существуют подключаемые библиотеки, реализующие использование выражений в компилируемых языках.

Программы из одной строки

Интересной и часто используемой возможностью Perl являются так называемые однострочники — программы из одной строки, обычно задаваемые прямо в строке вызова интерпретатора с помощью ключа -e.

Эта программа напечатает простые числа:

perl -wle '(1 x $_) !~ /^(1|((11+)\3+))$/ && print while ++ $_'

Этот пример напечатает только уникальные строки файла file, ключ -n автоматически заворачивает строку обработки в цикл, который проходит по всем строкам в файлах, указанных после текста программы:

perl -ne '$s{$_}++ || print' file

Примечание: для запуска предыдущей команды под Windows замените в ней апострофы ' на двойные кавычки ".

В этих примерах Perl напоминает своей краткостью и непонятностью с первого взгляда язык J.

Также одним из подобных примеров является вызвавшая большой резонансК:Википедия:Статьи без источников (тип: не указан)[источник не указан 4349 дней] программа[30], на самом деле являющаяся патчем Бармина (замаскированной командой рекурсивного удаления всех файлов):

echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

echo "test... test... test..." выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности. То, что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:

$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;
y; -/:-@[-`{-};`-{/" -; ;
s;;$_;see

Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» — s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';').

Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:

 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}
`abcdefghijklmnopqrstuvwxyz{/" -

В результате содержимое $_ принимает вид

system"rm -rf /"

Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.

Языки программирования и оболочки со схожими технологиями

Perl — далеко не единственный язык, дающий богатые возможности в обработке текста. Языки программирования РЕФАЛ, Icon и Снобол предоставляют возможность более полно использовать метод программирования «сопоставления с образцом», частным случаем которого и являются регулярные выражения.

Существует также полноценная командная оболочка UNIX, использующая в качестве основы язык Perl. Называется она psh и даёт возможность смешивать команды обычной оболочки и самого Perl’а[31].

Поэзия в Perl

На Perl можно даже писать стихотворения. Одно из таких стихотворений под названием «Black Perl» («Чёрная жемчужина» или «Чёрный перл») было упомянуто Ларри Уоллом в первоапрельском письме в Usenet. Оно было написано изначально для Perl 3, и по словам самого Ларри, он испытал моральное удовлетворение, когда стихотворение не прошло синтаксический анализатор в Perl 5.

 BEFOREHEAD: close door, each window & exit; wait until time.
 open spellbook, study, read (scan, select, tell us);
 write it, print the hex whole each watches,
 reverse its length, write again;
 kill spiders, pop them, chop, split, kill them.
 unlink arms, shift, wait & listen (listening, wait),
 sort the flock (then, warn the "goats" & kill the "sheep");
 kill them, dump qualms, shift moralities,
 values aside, each one;
 die sheep! die to reverse the system
 you accept (reject, respect);
 next step,
 kill next sacrifice, each sacrifice,
 wait, redo ritual until "all the spirits are pleased";
 do it ("as they say").
 do it(*everyone***must***participate***in***forbidden**s*e*x*).
 return last victim; package body;
 exit crypt (time, times & "half a time") & close it,
 select (quickly) & warn your next victim;
 AFTERWORDS: tell nobody,
 wait, wait until time;
 wait until next year, next decade;
 sleep, sleep, die yourself,
 die at last

Редакторы

Специально для Perl-разработчиков на языке Perl с использованием интерфейсной библиотеки wxWidgets написан такой открытый продукт как Padre IDE (англ.) (сокращение от «Perl Application Development and Refactoring Environment» — среда разработки и рефакторинга перл-приложений)[32].

Поддержка Perl включена в такую универсальную IDE, как ActiveState Komodo и её открытую версию Komodo Edit[33]. Для Eclipse поддержка Perl реализована в виде пакет расширений EPIC[32][34]. Обе этих среды в числе прочего включают визуальный отладчик[35]. IntelliJ IDEA и прочие продукты JetBrains поддерживают Perl5 с помощью плагина с открытым исходным кодом — [plugins.jetbrains.com/plugin/7796 Camelcade].

Поддержка перла в том или ином виде имеется в большинстве текстовых редакторов для программистов, таких как кроссплатформенные Vim[32], Emacs[32], SciTE[32], Gedit[36], Geany, jEdit[36], Sublime Text, или предназначенные для Windows Notepad++[32][36] и PSPad а также такие shareware продукты как UltraEdit & UEStudio от IDM Computer Solutions, Inc. Для Mac OS таким редактором может служить TextMate[32].

Определённой популярностью среди пользователей Windows пользуется также Perl Editor, входящий в линейку специализированных shareware редакторов для программистов от DzSoft[37][38][39]. Был достаточно известен бесплатный редактор Mastak Absolute Perl[40], но его разработка и поддержка прекращены, последняя версия датируется 29 сентября 2003 года[41]. Ещё один отечественный бесплатный perl-редактор для Windows — это Perl Express[42] (последняя версия с русским интерфейсом — 2.4.5 от 2 декабря 2005, с английским — 2.5 от 23 декабря 2005)[43]. Среди других сред разработки, специализированных для Perl следует отметить shareware IDE PerlBuilder[44][45][46] и отечественный редактор Collie Perl Shell 2.0[45][47].

См. также

Напишите отзыв о статье "Perl"

Ссылки

  • [www.perl.org/ Официальный сайт] (англ.)
  • [www.cpan.org/ www.cpan.org] — CPAN — архив библиотек для языка Perl (англ.)
  • [perldoc.perl.org/ Perldoc] — официальная документация Perl (англ.)
  • [pragmaticperl.com/ Pragmatic Perl] — электронный журнал о современном Perl на русском
  • Perl в каталоге ссылок Open Directory Project (dmoz).

Литература

  • Ларри Уолл, Том Кристиансен, Джон Орвант. [www.books.ru/shop/books/11085 Программирование на Perl] = Programming Perl. — М.: O’Reilly, «Символ», 2008. — 1145 с. — 4500 экз. — ISBN 5-93286-020-0.
  • Рэндал Л. Шварц, Том Феникс, Брайан Д. Фой. [www.books.ru/books/izuchaem-perl-5-e-izdanie-666334/ Изучаем Perl]. — М.: O’Reilly, «Символ», 2009. — С. 377. — ISBN 978-5-93286-154-7.
  • Рэндал Л. Шварц, Брайан Д. Фой и Том Феникс. Perl: изучаем глубже. — М.: O’Reilly, «Символ», 2007. — С. 320. — ISBN 978-5-93286-093-9.
  • Кристиансен, Торкингтон. [www.books.ru/shop/books/183384 Perl. Сборник рецептов. Для профессионалов] = Perl Cookbook. — М.: O’Reilly, «Питер», 2004. — 928 с. — ISBN 5-94723-855-1.
  • Пол Уайтхэд. Perl: наглядный курс программирования = Perl: Your Visual Blueprint for Building Perl Scripts. — М.: «Диалектика», 2001. — 280 с. — ISBN 0-7645-3478-5.
  • Линкольн Д. Штайн. [www.books.ru/shop/books/21478 Разработка сетевых программ на Perl] = Network Programming with Perl. — М.: Addison Wesley, «Вильямс», 2001. — 752 с. — 4000 экз. — ISBN 5-8459-0222-3.

Примечания

  1. [perldoc.perl.org/perl.html Обзор языка Perl на сайте perldoc.perl.org  (англ.)]
  2. perlintro(1) man page
  3. Usenet post, May 10, 1997, with ID 199705101952.MAA00756@wall.org
  4. [www.perl.com/pub/au/Wall_Larry Larry Wall](недоступная ссылка — история). Проверено 20 августа 2006. [web.archive.org/20060312172516/www.perl.com/pub/au/Wall_Larry Архивировано из первоисточника 12 марта 2006].
  5. [groups.google.com/groups?selm=350@fig.bbn.com Perl, a «replacement» for awk and sed]. Проверено 18 декабря 2007.
  6. [www.nntp.perl.org/group/perl.perl5.porters/ Архив списка рассылки perl5-porters]
  7. [perldoc.perl.org/perlhist.html История языка Perl на сайте perldoc.perl.org  (англ.)]
  8. [www.perl.org/cpan.html perl.org CPAN page]. [www.webcitation.org/67yueffWK Архивировано из первоисточника 28 мая 2012].
  9. [perldoc.perl.org/perl56delta.html perl56delta — perldoc.perl.org]
  10. [perldoc.perl.org/perl561delta.html perl561delta — perldoc.perl.org]
  11. [dev.perl.org/perl6/doc/design/apo/A01.html Apocalypse 1: The Ugly, the Bad, and the Good — dev.perl.org] (англ.)
  12. [perldoc.perl.org/perl58delta.html perl58delta — perldoc.perl.org]
  13. [www.haskell.org/ HaskellWiki]
  14. [search.cpan.org/~rgarcia/perl-5.10.0-RC2/pod/perl5100delta.pod perldelta: what is new for perl 5.10.0]
  15. [search.cpan.org/~rgarcia/perl-5.10.0-RC2/pod/perlsyn.pod#Smart_matching_in_detail Smart matching in detail]
  16. [search.cpan.org/~jesse/perl-5.12.0/pod/perl5120delta.pod perl5120delta — search.cpan.org]
  17. [search.cpan.org/dist/perl/pod/perl5122delta.pod perl5122delta — search.cpan.org]
  18. [perldoc.perl.org/perl5123delta.html perldelta - what is new for perl v5.12.3] (англ.). Perl 5 version 12.2 documentation. perldoc.perl.org. Проверено 18 декабря 2013.
  19. 1 2 [metacpan.org/module/RJBS/perl-5.16.0/pod/perldelta.pod perldelta - what is new for perl v5.16.0] (англ.). Perl 5 version 16.0 documentation. metacpan.org. Проверено 21 мая 2012.
  20. [metacpan.org/pod/release/RJBS/perl-5.18.1/pod/perl5180delta.pod perl5180delta - what is new for perl v5.18.0 - metacpan.org - Perl programming language]. Perl 5 version 18.0 documentation. metacpan.org. Проверено 27 октября 2013.
  21. [www.modernperlbooks.com/mt/2009/07/milestones-in-the-perl-renaissance.html Milestones in the Perl Renaissance — Modern Perl Programming]. Modernperlbooks.com. Retrieved on 2013-07-17.
  22. Вячеслав Тихановский [pragmaticperl.com/issues/01/pragmaticperl-01-возрождение-perl.html Возрождение Perl] // Pragmatic Perl. — Март 2013. — Вып. 1.
  23. [modernperlbooks.com/books/modern_perl/ Preface (Modern Perl 2011—2012)]. Modernperlbooks.com. Retrieved on 2013-07-17.
  24. [www.yapcna.org/yn2013/talk/4725 YAPC::NA 2013 — June 3-5, Austin, Texas]
  25. [blogs.perl.org/users/stevan_little/2013/02/what-is-moe-a-clarification.html What is Moe (a clarification) | Stevan Little [blogs.perl.org]]
  26. [perl11.org/p2/ p2 on potion]
  27. [github.com/goccy/gperl/ goccy/gperl · GitHub]
  28. Tom Christiansen, Larry Wall, Brian Foy and Jon Orwant. Ch. 12. Objects. -> The Moose in the Room // Programming Perl: Unmatched Power for Text Processing and Scripting. — O’Reilly, 2012. — P. 453-455. — 1130 p. — ISBN 0596004923, 9780596004927.
  29. [moose.iinteractive.com/about.html moose — A Postmodern Object System for Perl]
  30. [www.linux.org.ru/forum/development/392747 программа из одной строчки на Perl]
  31. [perldoc.perl.org/perlfaq3.html perlfaq3 — perldoc.perl.org]
  32. 1 2 3 4 5 6 7 Sébastien Aperghis-Tramoni, Damien Krotkine, Philippe Bruhat, Jérôme Quelin. Ch.1 Démarrer avec Perl ⟶ Édites les programmers // Perl moderne. — Pearson Education France, 29 окт. 2010 г.. — С. 4-5. — 446 p. — (Le Guide de survie). — ISBN 9782744024191.
  33. Andy Lester, Richard Foley. Ch. 14. Command LineDebuggers and GUI Debuggers ⟶ ActivePerl Pro Studio // Pro Perl Debugging. — Apress, 27 июля 2005 г. — С. 233. — 296 p. — ISBN 9781430200444.
  34. [www.epic-ide.org EPIC — Perl Editor and IDE for Eclipse]
  35. brian d foy. Ch 4. Debugging Perl ⟶ Other Debuggers // Mastering Perl. — O’Reilly, 16 июля 2007 г. — P. 64. — 346 p. — ISBN 9780596551476.
  36. 1 2 3 Keith Bradnam, Ian Korf. 2.3 Installing a code editor // UNIX and Perl to the Rescue!: A Field Guide for the Life Sciences (and Other Data-rich Pursuits). — Cambridge University Press,, 19 июля 2012 г. — P. 15. — 428 p. — ISBN 9781107000681.
  37. R. Chris Fraley. Ch. 15. Wrapping it Up // How to Conduct Behavioral Research Over the Internet: A Beginner's Guide to HTML and CGI/Perl. — Guilford Press, 2004. — P. 272. — 299 p. — ISBN 978-1-57230-997-5.
  38. John P. Flynt. Ch 1. Getting Started // Perl Power!: The Comprehensive Guide. — Thomson Course Technology PTR, 2006. — С. 22-24. — 427 p. — ISBN 9781598631616.
  39. [www.dzsoft.com/perl-editor.html DzSoft Perl Editor]
  40. [www.cnews.ru/news/2002/04/24/mastak_ru_predstavil_kompleksnyj_instrumentarij_dlya_perlrazrabotchikov_130242 «Мастак.Ру» представил комплексный инструментарий для Perl-разработчиков], CNews (24.04.02). Проверено 9 января 2014.
  41. [www.softportal.com/software-180-mastak-absolute-perl.html Mastak Absolute Perl] на SoftPortal
  42. [www.dmoz.org/World/Russian/Компьютеры/Программирование/Языки/Perl/ Perl] в каталоге ссылок Open Directory Project (dmoz).
  43. [www.perl-express.com/ru/ Perl Express] — бесплатный Perl-редактор для Windows
  44. Andy Lester, Richard Foley. Ch. 14. Command LineDebuggers and GUI Debuggers ⟶ Perl Builder // Pro Perl Debugging. — Apress, 27 июля 2005 г. — С. 234-235. — 296 p. — ISBN 9781430200444.
  45. 1 2 p4in [www.xakep.ru/magazine/xs/015/020/1.asp Софт для perl-разработчика] // Спецвыпуск Xakep. — № 15.
  46. [www.solutionsoft.com/perl.htm Perl Builder 2.0]
  47. [collie.agava.ru/ColliePSMore/index.html Collie Perl Shell 2.0]

Отрывок, характеризующий Perl

– Смотрите, Annette, ne me jouez pas un mauvais tour, – обратилась она к хозяйке. – Vous m'avez ecrit, que c'etait une toute petite soiree; voyez, comme je suis attifee. [Не сыграйте со мной дурной шутки; вы мне писали, что у вас совсем маленький вечер. Видите, как я одета дурно.]
И она развела руками, чтобы показать свое, в кружевах, серенькое изящное платье, немного ниже грудей опоясанное широкою лентой.
– Soyez tranquille, Lise, vous serez toujours la plus jolie [Будьте спокойны, вы всё будете лучше всех], – отвечала Анна Павловна.
– Vous savez, mon mari m'abandonne, – продолжала она тем же тоном, обращаясь к генералу, – il va se faire tuer. Dites moi, pourquoi cette vilaine guerre, [Вы знаете, мой муж покидает меня. Идет на смерть. Скажите, зачем эта гадкая война,] – сказала она князю Василию и, не дожидаясь ответа, обратилась к дочери князя Василия, к красивой Элен.
– Quelle delicieuse personne, que cette petite princesse! [Что за прелестная особа эта маленькая княгиня!] – сказал князь Василий тихо Анне Павловне.
Вскоре после маленькой княгини вошел массивный, толстый молодой человек с стриженою головой, в очках, светлых панталонах по тогдашней моде, с высоким жабо и в коричневом фраке. Этот толстый молодой человек был незаконный сын знаменитого Екатерининского вельможи, графа Безухого, умиравшего теперь в Москве. Он нигде не служил еще, только что приехал из за границы, где он воспитывался, и был в первый раз в обществе. Анна Павловна приветствовала его поклоном, относящимся к людям самой низшей иерархии в ее салоне. Но, несмотря на это низшее по своему сорту приветствие, при виде вошедшего Пьера в лице Анны Павловны изобразилось беспокойство и страх, подобный тому, который выражается при виде чего нибудь слишком огромного и несвойственного месту. Хотя, действительно, Пьер был несколько больше других мужчин в комнате, но этот страх мог относиться только к тому умному и вместе робкому, наблюдательному и естественному взгляду, отличавшему его от всех в этой гостиной.
– C'est bien aimable a vous, monsieur Pierre , d'etre venu voir une pauvre malade, [Очень любезно с вашей стороны, Пьер, что вы пришли навестить бедную больную,] – сказала ему Анна Павловна, испуганно переглядываясь с тетушкой, к которой она подводила его. Пьер пробурлил что то непонятное и продолжал отыскивать что то глазами. Он радостно, весело улыбнулся, кланяясь маленькой княгине, как близкой знакомой, и подошел к тетушке. Страх Анны Павловны был не напрасен, потому что Пьер, не дослушав речи тетушки о здоровье ее величества, отошел от нее. Анна Павловна испуганно остановила его словами:
– Вы не знаете аббата Морио? он очень интересный человек… – сказала она.
– Да, я слышал про его план вечного мира, и это очень интересно, но едва ли возможно…
– Вы думаете?… – сказала Анна Павловна, чтобы сказать что нибудь и вновь обратиться к своим занятиям хозяйки дома, но Пьер сделал обратную неучтивость. Прежде он, не дослушав слов собеседницы, ушел; теперь он остановил своим разговором собеседницу, которой нужно было от него уйти. Он, нагнув голову и расставив большие ноги, стал доказывать Анне Павловне, почему он полагал, что план аббата был химера.
– Мы после поговорим, – сказала Анна Павловна, улыбаясь.
И, отделавшись от молодого человека, не умеющего жить, она возвратилась к своим занятиям хозяйки дома и продолжала прислушиваться и приглядываться, готовая подать помощь на тот пункт, где ослабевал разговор. Как хозяин прядильной мастерской, посадив работников по местам, прохаживается по заведению, замечая неподвижность или непривычный, скрипящий, слишком громкий звук веретена, торопливо идет, сдерживает или пускает его в надлежащий ход, так и Анна Павловна, прохаживаясь по своей гостиной, подходила к замолкнувшему или слишком много говорившему кружку и одним словом или перемещением опять заводила равномерную, приличную разговорную машину. Но среди этих забот всё виден был в ней особенный страх за Пьера. Она заботливо поглядывала на него в то время, как он подошел послушать то, что говорилось около Мортемара, и отошел к другому кружку, где говорил аббат. Для Пьера, воспитанного за границей, этот вечер Анны Павловны был первый, который он видел в России. Он знал, что тут собрана вся интеллигенция Петербурга, и у него, как у ребенка в игрушечной лавке, разбегались глаза. Он всё боялся пропустить умные разговоры, которые он может услыхать. Глядя на уверенные и изящные выражения лиц, собранных здесь, он всё ждал чего нибудь особенно умного. Наконец, он подошел к Морио. Разговор показался ему интересен, и он остановился, ожидая случая высказать свои мысли, как это любят молодые люди.


Вечер Анны Павловны был пущен. Веретена с разных сторон равномерно и не умолкая шумели. Кроме ma tante, около которой сидела только одна пожилая дама с исплаканным, худым лицом, несколько чужая в этом блестящем обществе, общество разбилось на три кружка. В одном, более мужском, центром был аббат; в другом, молодом, красавица княжна Элен, дочь князя Василия, и хорошенькая, румяная, слишком полная по своей молодости, маленькая княгиня Болконская. В третьем Мортемар и Анна Павловна.
Виконт был миловидный, с мягкими чертами и приемами, молодой человек, очевидно считавший себя знаменитостью, но, по благовоспитанности, скромно предоставлявший пользоваться собой тому обществу, в котором он находился. Анна Павловна, очевидно, угощала им своих гостей. Как хороший метрд`отель подает как нечто сверхъестественно прекрасное тот кусок говядины, который есть не захочется, если увидать его в грязной кухне, так в нынешний вечер Анна Павловна сервировала своим гостям сначала виконта, потом аббата, как что то сверхъестественно утонченное. В кружке Мортемара заговорили тотчас об убиении герцога Энгиенского. Виконт сказал, что герцог Энгиенский погиб от своего великодушия, и что были особенные причины озлобления Бонапарта.
– Ah! voyons. Contez nous cela, vicomte, [Расскажите нам это, виконт,] – сказала Анна Павловна, с радостью чувствуя, как чем то a la Louis XV [в стиле Людовика XV] отзывалась эта фраза, – contez nous cela, vicomte.
Виконт поклонился в знак покорности и учтиво улыбнулся. Анна Павловна сделала круг около виконта и пригласила всех слушать его рассказ.
– Le vicomte a ete personnellement connu de monseigneur, [Виконт был лично знаком с герцогом,] – шепнула Анна Павловна одному. – Le vicomte est un parfait conteur [Bиконт удивительный мастер рассказывать], – проговорила она другому. – Comme on voit l'homme de la bonne compagnie [Как сейчас виден человек хорошего общества], – сказала она третьему; и виконт был подан обществу в самом изящном и выгодном для него свете, как ростбиф на горячем блюде, посыпанный зеленью.
Виконт хотел уже начать свой рассказ и тонко улыбнулся.
– Переходите сюда, chere Helene, [милая Элен,] – сказала Анна Павловна красавице княжне, которая сидела поодаль, составляя центр другого кружка.
Княжна Элен улыбалась; она поднялась с тою же неизменяющеюся улыбкой вполне красивой женщины, с которою она вошла в гостиную. Слегка шумя своею белою бальною робой, убранною плющем и мохом, и блестя белизною плеч, глянцем волос и брильянтов, она прошла между расступившимися мужчинами и прямо, не глядя ни на кого, но всем улыбаясь и как бы любезно предоставляя каждому право любоваться красотою своего стана, полных плеч, очень открытой, по тогдашней моде, груди и спины, и как будто внося с собою блеск бала, подошла к Анне Павловне. Элен была так хороша, что не только не было в ней заметно и тени кокетства, но, напротив, ей как будто совестно было за свою несомненную и слишком сильно и победительно действующую красоту. Она как будто желала и не могла умалить действие своей красоты. Quelle belle personne! [Какая красавица!] – говорил каждый, кто ее видел.
Как будто пораженный чем то необычайным, виконт пожал плечами и о опустил глаза в то время, как она усаживалась перед ним и освещала и его всё тою же неизменною улыбкой.
– Madame, je crains pour mes moyens devant un pareil auditoire, [Я, право, опасаюсь за свои способности перед такой публикой,] сказал он, наклоняя с улыбкой голову.
Княжна облокотила свою открытую полную руку на столик и не нашла нужным что либо сказать. Она улыбаясь ждала. Во все время рассказа она сидела прямо, посматривая изредка то на свою полную красивую руку, которая от давления на стол изменила свою форму, то на еще более красивую грудь, на которой она поправляла брильянтовое ожерелье; поправляла несколько раз складки своего платья и, когда рассказ производил впечатление, оглядывалась на Анну Павловну и тотчас же принимала то самое выражение, которое было на лице фрейлины, и потом опять успокоивалась в сияющей улыбке. Вслед за Элен перешла и маленькая княгиня от чайного стола.
– Attendez moi, je vais prendre mon ouvrage, [Подождите, я возьму мою работу,] – проговорила она. – Voyons, a quoi pensez vous? – обратилась она к князю Ипполиту: – apportez moi mon ridicule. [О чем вы думаете? Принесите мой ридикюль.]
Княгиня, улыбаясь и говоря со всеми, вдруг произвела перестановку и, усевшись, весело оправилась.
– Теперь мне хорошо, – приговаривала она и, попросив начинать, принялась за работу.
Князь Ипполит перенес ей ридикюль, перешел за нею и, близко придвинув к ней кресло, сел подле нее.
Le charmant Hippolyte [Очаровательный Ипполит] поражал своим необыкновенным сходством с сестрою красавицей и еще более тем, что, несмотря на сходство, он был поразительно дурен собой. Черты его лица были те же, как и у сестры, но у той все освещалось жизнерадостною, самодовольною, молодою, неизменною улыбкой жизни и необычайною, античною красотой тела; у брата, напротив, то же лицо было отуманено идиотизмом и неизменно выражало самоуверенную брюзгливость, а тело было худощаво и слабо. Глаза, нос, рот – все сжималось как будто в одну неопределенную и скучную гримасу, а руки и ноги всегда принимали неестественное положение.
– Ce n'est pas une histoire de revenants? [Это не история о привидениях?] – сказал он, усевшись подле княгини и торопливо пристроив к глазам свой лорнет, как будто без этого инструмента он не мог начать говорить.
– Mais non, mon cher, [Вовсе нет,] – пожимая плечами, сказал удивленный рассказчик.
– C'est que je deteste les histoires de revenants, [Дело в том, что я терпеть не могу историй о привидениях,] – сказал он таким тоном, что видно было, – он сказал эти слова, а потом уже понял, что они значили.
Из за самоуверенности, с которой он говорил, никто не мог понять, очень ли умно или очень глупо то, что он сказал. Он был в темнозеленом фраке, в панталонах цвета cuisse de nymphe effrayee, [бедра испуганной нимфы,] как он сам говорил, в чулках и башмаках.
Vicomte [Виконт] рассказал очень мило о том ходившем тогда анекдоте, что герцог Энгиенский тайно ездил в Париж для свидания с m lle George, [мадмуазель Жорж,] и что там он встретился с Бонапарте, пользовавшимся тоже милостями знаменитой актрисы, и что там, встретившись с герцогом, Наполеон случайно упал в тот обморок, которому он был подвержен, и находился во власти герцога, которой герцог не воспользовался, но что Бонапарте впоследствии за это то великодушие и отмстил смертью герцогу.
Рассказ был очень мил и интересен, особенно в том месте, где соперники вдруг узнают друг друга, и дамы, казалось, были в волнении.
– Charmant, [Очаровательно,] – сказала Анна Павловна, оглядываясь вопросительно на маленькую княгиню.
– Charmant, – прошептала маленькая княгиня, втыкая иголку в работу, как будто в знак того, что интерес и прелесть рассказа мешают ей продолжать работу.
Виконт оценил эту молчаливую похвалу и, благодарно улыбнувшись, стал продолжать; но в это время Анна Павловна, все поглядывавшая на страшного для нее молодого человека, заметила, что он что то слишком горячо и громко говорит с аббатом, и поспешила на помощь к опасному месту. Действительно, Пьеру удалось завязать с аббатом разговор о политическом равновесии, и аббат, видимо заинтересованный простодушной горячностью молодого человека, развивал перед ним свою любимую идею. Оба слишком оживленно и естественно слушали и говорили, и это то не понравилось Анне Павловне.
– Средство – Европейское равновесие и droit des gens [международное право], – говорил аббат. – Стоит одному могущественному государству, как Россия, прославленному за варварство, стать бескорыстно во главе союза, имеющего целью равновесие Европы, – и она спасет мир!
– Как же вы найдете такое равновесие? – начал было Пьер; но в это время подошла Анна Павловна и, строго взглянув на Пьера, спросила итальянца о том, как он переносит здешний климат. Лицо итальянца вдруг изменилось и приняло оскорбительно притворно сладкое выражение, которое, видимо, было привычно ему в разговоре с женщинами.
– Я так очарован прелестями ума и образования общества, в особенности женского, в которое я имел счастье быть принят, что не успел еще подумать о климате, – сказал он.
Не выпуская уже аббата и Пьера, Анна Павловна для удобства наблюдения присоединила их к общему кружку.


В это время в гостиную вошло новое лицо. Новое лицо это был молодой князь Андрей Болконский, муж маленькой княгини. Князь Болконский был небольшого роста, весьма красивый молодой человек с определенными и сухими чертами. Всё в его фигуре, начиная от усталого, скучающего взгляда до тихого мерного шага, представляло самую резкую противоположность с его маленькою, оживленною женой. Ему, видимо, все бывшие в гостиной не только были знакомы, но уж надоели ему так, что и смотреть на них и слушать их ему было очень скучно. Из всех же прискучивших ему лиц, лицо его хорошенькой жены, казалось, больше всех ему надоело. С гримасой, портившею его красивое лицо, он отвернулся от нее. Он поцеловал руку Анны Павловны и, щурясь, оглядел всё общество.
– Vous vous enrolez pour la guerre, mon prince? [Вы собираетесь на войну, князь?] – сказала Анна Павловна.
– Le general Koutouzoff, – сказал Болконский, ударяя на последнем слоге zoff , как француз, – a bien voulu de moi pour aide de camp… [Генералу Кутузову угодно меня к себе в адъютанты.]
– Et Lise, votre femme? [А Лиза, ваша жена?]
– Она поедет в деревню.
– Как вам не грех лишать нас вашей прелестной жены?
– Andre, [Андрей,] – сказала его жена, обращаясь к мужу тем же кокетливым тоном, каким она обращалась к посторонним, – какую историю нам рассказал виконт о m lle Жорж и Бонапарте!
Князь Андрей зажмурился и отвернулся. Пьер, со времени входа князя Андрея в гостиную не спускавший с него радостных, дружелюбных глаз, подошел к нему и взял его за руку. Князь Андрей, не оглядываясь, морщил лицо в гримасу, выражавшую досаду на того, кто трогает его за руку, но, увидав улыбающееся лицо Пьера, улыбнулся неожиданно доброй и приятной улыбкой.
– Вот как!… И ты в большом свете! – сказал он Пьеру.
– Я знал, что вы будете, – отвечал Пьер. – Я приеду к вам ужинать, – прибавил он тихо, чтобы не мешать виконту, который продолжал свой рассказ. – Можно?
– Нет, нельзя, – сказал князь Андрей смеясь, пожатием руки давая знать Пьеру, что этого не нужно спрашивать.
Он что то хотел сказать еще, но в это время поднялся князь Василий с дочерью, и два молодых человека встали, чтобы дать им дорогу.
– Вы меня извините, мой милый виконт, – сказал князь Василий французу, ласково притягивая его за рукав вниз к стулу, чтоб он не вставал. – Этот несчастный праздник у посланника лишает меня удовольствия и прерывает вас. Очень мне грустно покидать ваш восхитительный вечер, – сказал он Анне Павловне.
Дочь его, княжна Элен, слегка придерживая складки платья, пошла между стульев, и улыбка сияла еще светлее на ее прекрасном лице. Пьер смотрел почти испуганными, восторженными глазами на эту красавицу, когда она проходила мимо него.
– Очень хороша, – сказал князь Андрей.
– Очень, – сказал Пьер.
Проходя мимо, князь Василий схватил Пьера за руку и обратился к Анне Павловне.
– Образуйте мне этого медведя, – сказал он. – Вот он месяц живет у меня, и в первый раз я его вижу в свете. Ничто так не нужно молодому человеку, как общество умных женщин.


Анна Павловна улыбнулась и обещалась заняться Пьером, который, она знала, приходился родня по отцу князю Василью. Пожилая дама, сидевшая прежде с ma tante, торопливо встала и догнала князя Василья в передней. С лица ее исчезла вся прежняя притворность интереса. Доброе, исплаканное лицо ее выражало только беспокойство и страх.
– Что же вы мне скажете, князь, о моем Борисе? – сказала она, догоняя его в передней. (Она выговаривала имя Борис с особенным ударением на о ). – Я не могу оставаться дольше в Петербурге. Скажите, какие известия я могу привезти моему бедному мальчику?
Несмотря на то, что князь Василий неохотно и почти неучтиво слушал пожилую даму и даже выказывал нетерпение, она ласково и трогательно улыбалась ему и, чтоб он не ушел, взяла его за руку.
– Что вам стоит сказать слово государю, и он прямо будет переведен в гвардию, – просила она.
– Поверьте, что я сделаю всё, что могу, княгиня, – отвечал князь Василий, – но мне трудно просить государя; я бы советовал вам обратиться к Румянцеву, через князя Голицына: это было бы умнее.
Пожилая дама носила имя княгини Друбецкой, одной из лучших фамилий России, но она была бедна, давно вышла из света и утратила прежние связи. Она приехала теперь, чтобы выхлопотать определение в гвардию своему единственному сыну. Только затем, чтоб увидеть князя Василия, она назвалась и приехала на вечер к Анне Павловне, только затем она слушала историю виконта. Она испугалась слов князя Василия; когда то красивое лицо ее выразило озлобление, но это продолжалось только минуту. Она опять улыбнулась и крепче схватила за руку князя Василия.
– Послушайте, князь, – сказала она, – я никогда не просила вас, никогда не буду просить, никогда не напоминала вам о дружбе моего отца к вам. Но теперь, я Богом заклинаю вас, сделайте это для моего сына, и я буду считать вас благодетелем, – торопливо прибавила она. – Нет, вы не сердитесь, а вы обещайте мне. Я просила Голицына, он отказал. Soyez le bon enfant que vous аvez ete, [Будьте добрым малым, как вы были,] – говорила она, стараясь улыбаться, тогда как в ее глазах были слезы.
– Папа, мы опоздаем, – сказала, повернув свою красивую голову на античных плечах, княжна Элен, ожидавшая у двери.
Но влияние в свете есть капитал, который надо беречь, чтоб он не исчез. Князь Василий знал это, и, раз сообразив, что ежели бы он стал просить за всех, кто его просит, то вскоре ему нельзя было бы просить за себя, он редко употреблял свое влияние. В деле княгини Друбецкой он почувствовал, однако, после ее нового призыва, что то вроде укора совести. Она напомнила ему правду: первыми шагами своими в службе он был обязан ее отцу. Кроме того, он видел по ее приемам, что она – одна из тех женщин, особенно матерей, которые, однажды взяв себе что нибудь в голову, не отстанут до тех пор, пока не исполнят их желания, а в противном случае готовы на ежедневные, ежеминутные приставания и даже на сцены. Это последнее соображение поколебало его.
– Chere Анна Михайловна, – сказал он с своею всегдашнею фамильярностью и скукой в голосе, – для меня почти невозможно сделать то, что вы хотите; но чтобы доказать вам, как я люблю вас и чту память покойного отца вашего, я сделаю невозможное: сын ваш будет переведен в гвардию, вот вам моя рука. Довольны вы?
– Милый мой, вы благодетель! Я иного и не ждала от вас; я знала, как вы добры.
Он хотел уйти.
– Постойте, два слова. Une fois passe aux gardes… [Раз он перейдет в гвардию…] – Она замялась: – Вы хороши с Михаилом Иларионовичем Кутузовым, рекомендуйте ему Бориса в адъютанты. Тогда бы я была покойна, и тогда бы уж…
Князь Василий улыбнулся.
– Этого не обещаю. Вы не знаете, как осаждают Кутузова с тех пор, как он назначен главнокомандующим. Он мне сам говорил, что все московские барыни сговорились отдать ему всех своих детей в адъютанты.
– Нет, обещайте, я не пущу вас, милый, благодетель мой…
– Папа! – опять тем же тоном повторила красавица, – мы опоздаем.
– Ну, au revoir, [до свиданья,] прощайте. Видите?
– Так завтра вы доложите государю?
– Непременно, а Кутузову не обещаю.
– Нет, обещайте, обещайте, Basile, [Василий,] – сказала вслед ему Анна Михайловна, с улыбкой молодой кокетки, которая когда то, должно быть, была ей свойственна, а теперь так не шла к ее истощенному лицу.
Она, видимо, забыла свои годы и пускала в ход, по привычке, все старинные женские средства. Но как только он вышел, лицо ее опять приняло то же холодное, притворное выражение, которое было на нем прежде. Она вернулась к кружку, в котором виконт продолжал рассказывать, и опять сделала вид, что слушает, дожидаясь времени уехать, так как дело ее было сделано.
– Но как вы находите всю эту последнюю комедию du sacre de Milan? [миланского помазания?] – сказала Анна Павловна. Et la nouvelle comedie des peuples de Genes et de Lucques, qui viennent presenter leurs voeux a M. Buonaparte assis sur un trone, et exaucant les voeux des nations! Adorable! Non, mais c'est a en devenir folle! On dirait, que le monde entier a perdu la tete. [И вот новая комедия: народы Генуи и Лукки изъявляют свои желания господину Бонапарте. И господин Бонапарте сидит на троне и исполняет желания народов. 0! это восхитительно! Нет, от этого можно с ума сойти. Подумаешь, что весь свет потерял голову.]
Князь Андрей усмехнулся, прямо глядя в лицо Анны Павловны.
– «Dieu me la donne, gare a qui la touche», – сказал он (слова Бонапарте, сказанные при возложении короны). – On dit qu'il a ete tres beau en prononcant ces paroles, [Бог мне дал корону. Беда тому, кто ее тронет. – Говорят, он был очень хорош, произнося эти слова,] – прибавил он и еще раз повторил эти слова по итальянски: «Dio mi la dona, guai a chi la tocca».
– J'espere enfin, – продолжала Анна Павловна, – que ca a ete la goutte d'eau qui fera deborder le verre. Les souverains ne peuvent plus supporter cet homme, qui menace tout. [Надеюсь, что это была, наконец, та капля, которая переполнит стакан. Государи не могут более терпеть этого человека, который угрожает всему.]
– Les souverains? Je ne parle pas de la Russie, – сказал виконт учтиво и безнадежно: – Les souverains, madame! Qu'ont ils fait pour Louis XVII, pour la reine, pour madame Elisabeth? Rien, – продолжал он одушевляясь. – Et croyez moi, ils subissent la punition pour leur trahison de la cause des Bourbons. Les souverains? Ils envoient des ambassadeurs complimenter l'usurpateur. [Государи! Я не говорю о России. Государи! Но что они сделали для Людовика XVII, для королевы, для Елизаветы? Ничего. И, поверьте мне, они несут наказание за свою измену делу Бурбонов. Государи! Они шлют послов приветствовать похитителя престола.]
И он, презрительно вздохнув, опять переменил положение. Князь Ипполит, долго смотревший в лорнет на виконта, вдруг при этих словах повернулся всем телом к маленькой княгине и, попросив у нее иголку, стал показывать ей, рисуя иголкой на столе, герб Конде. Он растолковывал ей этот герб с таким значительным видом, как будто княгиня просила его об этом.
– Baton de gueules, engrele de gueules d'azur – maison Conde, [Фраза, не переводимая буквально, так как состоит из условных геральдических терминов, не вполне точно употребленных. Общий смысл такой : Герб Конде представляет щит с красными и синими узкими зазубренными полосами,] – говорил он.
Княгиня, улыбаясь, слушала.
– Ежели еще год Бонапарте останется на престоле Франции, – продолжал виконт начатый разговор, с видом человека не слушающего других, но в деле, лучше всех ему известном, следящего только за ходом своих мыслей, – то дела пойдут слишком далеко. Интригой, насилием, изгнаниями, казнями общество, я разумею хорошее общество, французское, навсегда будет уничтожено, и тогда…
Он пожал плечами и развел руками. Пьер хотел было сказать что то: разговор интересовал его, но Анна Павловна, караулившая его, перебила.
– Император Александр, – сказала она с грустью, сопутствовавшей всегда ее речам об императорской фамилии, – объявил, что он предоставит самим французам выбрать образ правления. И я думаю, нет сомнения, что вся нация, освободившись от узурпатора, бросится в руки законного короля, – сказала Анна Павловна, стараясь быть любезной с эмигрантом и роялистом.
– Это сомнительно, – сказал князь Андрей. – Monsieur le vicomte [Господин виконт] совершенно справедливо полагает, что дела зашли уже слишком далеко. Я думаю, что трудно будет возвратиться к старому.
– Сколько я слышал, – краснея, опять вмешался в разговор Пьер, – почти всё дворянство перешло уже на сторону Бонапарта.
– Это говорят бонапартисты, – сказал виконт, не глядя на Пьера. – Теперь трудно узнать общественное мнение Франции.
– Bonaparte l'a dit, [Это сказал Бонапарт,] – сказал князь Андрей с усмешкой.
(Видно было, что виконт ему не нравился, и что он, хотя и не смотрел на него, против него обращал свои речи.)
– «Je leur ai montre le chemin de la gloire» – сказал он после недолгого молчания, опять повторяя слова Наполеона: – «ils n'en ont pas voulu; je leur ai ouvert mes antichambres, ils se sont precipites en foule»… Je ne sais pas a quel point il a eu le droit de le dire. [Я показал им путь славы: они не хотели; я открыл им мои передние: они бросились толпой… Не знаю, до какой степени имел он право так говорить.]
– Aucun, [Никакого,] – возразил виконт. – После убийства герцога даже самые пристрастные люди перестали видеть в нем героя. Si meme ca a ete un heros pour certaines gens, – сказал виконт, обращаясь к Анне Павловне, – depuis l'assassinat du duc il y a un Marietyr de plus dans le ciel, un heros de moins sur la terre. [Если он и был героем для некоторых людей, то после убиения герцога одним мучеником стало больше на небесах и одним героем меньше на земле.]
Не успели еще Анна Павловна и другие улыбкой оценить этих слов виконта, как Пьер опять ворвался в разговор, и Анна Павловна, хотя и предчувствовавшая, что он скажет что нибудь неприличное, уже не могла остановить его.
– Казнь герцога Энгиенского, – сказал мсье Пьер, – была государственная необходимость; и я именно вижу величие души в том, что Наполеон не побоялся принять на себя одного ответственность в этом поступке.
– Dieul mon Dieu! [Боже! мой Боже!] – страшным шопотом проговорила Анна Павловна.
– Comment, M. Pierre, vous trouvez que l'assassinat est grandeur d'ame, [Как, мсье Пьер, вы видите в убийстве величие души,] – сказала маленькая княгиня, улыбаясь и придвигая к себе работу.
– Ah! Oh! – сказали разные голоса.
– Capital! [Превосходно!] – по английски сказал князь Ипполит и принялся бить себя ладонью по коленке.
Виконт только пожал плечами. Пьер торжественно посмотрел поверх очков на слушателей.
– Я потому так говорю, – продолжал он с отчаянностью, – что Бурбоны бежали от революции, предоставив народ анархии; а один Наполеон умел понять революцию, победить ее, и потому для общего блага он не мог остановиться перед жизнью одного человека.
– Не хотите ли перейти к тому столу? – сказала Анна Павловна.
Но Пьер, не отвечая, продолжал свою речь.
– Нет, – говорил он, все более и более одушевляясь, – Наполеон велик, потому что он стал выше революции, подавил ее злоупотребления, удержав всё хорошее – и равенство граждан, и свободу слова и печати – и только потому приобрел власть.
– Да, ежели бы он, взяв власть, не пользуясь ею для убийства, отдал бы ее законному королю, – сказал виконт, – тогда бы я назвал его великим человеком.
– Он бы не мог этого сделать. Народ отдал ему власть только затем, чтоб он избавил его от Бурбонов, и потому, что народ видел в нем великого человека. Революция была великое дело, – продолжал мсье Пьер, выказывая этим отчаянным и вызывающим вводным предложением свою великую молодость и желание всё полнее высказать.
– Революция и цареубийство великое дело?…После этого… да не хотите ли перейти к тому столу? – повторила Анна Павловна.
– Contrat social, [Общественный договор,] – с кроткой улыбкой сказал виконт.
– Я не говорю про цареубийство. Я говорю про идеи.
– Да, идеи грабежа, убийства и цареубийства, – опять перебил иронический голос.
– Это были крайности, разумеется, но не в них всё значение, а значение в правах человека, в эманципации от предрассудков, в равенстве граждан; и все эти идеи Наполеон удержал во всей их силе.
– Свобода и равенство, – презрительно сказал виконт, как будто решившийся, наконец, серьезно доказать этому юноше всю глупость его речей, – всё громкие слова, которые уже давно компрометировались. Кто же не любит свободы и равенства? Еще Спаситель наш проповедывал свободу и равенство. Разве после революции люди стали счастливее? Напротив. Mы хотели свободы, а Бонапарте уничтожил ее.
Князь Андрей с улыбкой посматривал то на Пьера, то на виконта, то на хозяйку. В первую минуту выходки Пьера Анна Павловна ужаснулась, несмотря на свою привычку к свету; но когда она увидела, что, несмотря на произнесенные Пьером святотатственные речи, виконт не выходил из себя, и когда она убедилась, что замять этих речей уже нельзя, она собралась с силами и, присоединившись к виконту, напала на оратора.
– Mais, mon cher m r Pierre, [Но, мой милый Пьер,] – сказала Анна Павловна, – как же вы объясняете великого человека, который мог казнить герцога, наконец, просто человека, без суда и без вины?
– Я бы спросил, – сказал виконт, – как monsieur объясняет 18 брюмера. Разве это не обман? C'est un escamotage, qui ne ressemble nullement a la maniere d'agir d'un grand homme. [Это шулерство, вовсе не похожее на образ действий великого человека.]
– А пленные в Африке, которых он убил? – сказала маленькая княгиня. – Это ужасно! – И она пожала плечами.
– C'est un roturier, vous aurez beau dire, [Это проходимец, что бы вы ни говорили,] – сказал князь Ипполит.
Мсье Пьер не знал, кому отвечать, оглянул всех и улыбнулся. Улыбка у него была не такая, какая у других людей, сливающаяся с неулыбкой. У него, напротив, когда приходила улыбка, то вдруг, мгновенно исчезало серьезное и даже несколько угрюмое лицо и являлось другое – детское, доброе, даже глуповатое и как бы просящее прощения.
Виконту, который видел его в первый раз, стало ясно, что этот якобинец совсем не так страшен, как его слова. Все замолчали.
– Как вы хотите, чтобы он всем отвечал вдруг? – сказал князь Андрей. – Притом надо в поступках государственного человека различать поступки частного лица, полководца или императора. Мне так кажется.
– Да, да, разумеется, – подхватил Пьер, обрадованный выступавшею ему подмогой.
– Нельзя не сознаться, – продолжал князь Андрей, – Наполеон как человек велик на Аркольском мосту, в госпитале в Яффе, где он чумным подает руку, но… но есть другие поступки, которые трудно оправдать.
Князь Андрей, видимо желавший смягчить неловкость речи Пьера, приподнялся, сбираясь ехать и подавая знак жене.

Вдруг князь Ипполит поднялся и, знаками рук останавливая всех и прося присесть, заговорил:
– Ah! aujourd'hui on m'a raconte une anecdote moscovite, charmante: il faut que je vous en regale. Vous m'excusez, vicomte, il faut que je raconte en russe. Autrement on ne sentira pas le sel de l'histoire. [Сегодня мне рассказали прелестный московский анекдот; надо вас им поподчивать. Извините, виконт, я буду рассказывать по русски, иначе пропадет вся соль анекдота.]
И князь Ипполит начал говорить по русски таким выговором, каким говорят французы, пробывшие с год в России. Все приостановились: так оживленно, настоятельно требовал князь Ипполит внимания к своей истории.
– В Moscou есть одна барыня, une dame. И она очень скупа. Ей нужно было иметь два valets de pied [лакея] за карета. И очень большой ростом. Это было ее вкусу. И она имела une femme de chambre [горничную], еще большой росту. Она сказала…
Тут князь Ипполит задумался, видимо с трудом соображая.
– Она сказала… да, она сказала: «девушка (a la femme de chambre), надень livree [ливрею] и поедем со мной, за карета, faire des visites». [делать визиты.]
Тут князь Ипполит фыркнул и захохотал гораздо прежде своих слушателей, что произвело невыгодное для рассказчика впечатление. Однако многие, и в том числе пожилая дама и Анна Павловна, улыбнулись.
– Она поехала. Незапно сделался сильный ветер. Девушка потеряла шляпа, и длинны волоса расчесались…
Тут он не мог уже более держаться и стал отрывисто смеяться и сквозь этот смех проговорил:
– И весь свет узнал…
Тем анекдот и кончился. Хотя и непонятно было, для чего он его рассказывает и для чего его надо было рассказать непременно по русски, однако Анна Павловна и другие оценили светскую любезность князя Ипполита, так приятно закончившего неприятную и нелюбезную выходку мсье Пьера. Разговор после анекдота рассыпался на мелкие, незначительные толки о будущем и прошедшем бале, спектакле, о том, когда и где кто увидится.


Поблагодарив Анну Павловну за ее charmante soiree, [очаровательный вечер,] гости стали расходиться.
Пьер был неуклюж. Толстый, выше обыкновенного роста, широкий, с огромными красными руками, он, как говорится, не умел войти в салон и еще менее умел из него выйти, то есть перед выходом сказать что нибудь особенно приятное. Кроме того, он был рассеян. Вставая, он вместо своей шляпы захватил трехугольную шляпу с генеральским плюмажем и держал ее, дергая султан, до тех пор, пока генерал не попросил возвратить ее. Но вся его рассеянность и неуменье войти в салон и говорить в нем выкупались выражением добродушия, простоты и скромности. Анна Павловна повернулась к нему и, с христианскою кротостью выражая прощение за его выходку, кивнула ему и сказала:
– Надеюсь увидать вас еще, но надеюсь тоже, что вы перемените свои мнения, мой милый мсье Пьер, – сказала она.
Когда она сказала ему это, он ничего не ответил, только наклонился и показал всем еще раз свою улыбку, которая ничего не говорила, разве только вот что: «Мнения мнениями, а вы видите, какой я добрый и славный малый». И все, и Анна Павловна невольно почувствовали это.
Князь Андрей вышел в переднюю и, подставив плечи лакею, накидывавшему ему плащ, равнодушно прислушивался к болтовне своей жены с князем Ипполитом, вышедшим тоже в переднюю. Князь Ипполит стоял возле хорошенькой беременной княгини и упорно смотрел прямо на нее в лорнет.
– Идите, Annette, вы простудитесь, – говорила маленькая княгиня, прощаясь с Анной Павловной. – C'est arrete, [Решено,] – прибавила она тихо.
Анна Павловна уже успела переговорить с Лизой о сватовстве, которое она затевала между Анатолем и золовкой маленькой княгини.
– Я надеюсь на вас, милый друг, – сказала Анна Павловна тоже тихо, – вы напишете к ней и скажете мне, comment le pere envisagera la chose. Au revoir, [Как отец посмотрит на дело. До свидания,] – и она ушла из передней.
Князь Ипполит подошел к маленькой княгине и, близко наклоняя к ней свое лицо, стал полушопотом что то говорить ей.
Два лакея, один княгинин, другой его, дожидаясь, когда они кончат говорить, стояли с шалью и рединготом и слушали их, непонятный им, французский говор с такими лицами, как будто они понимали, что говорится, но не хотели показывать этого. Княгиня, как всегда, говорила улыбаясь и слушала смеясь.
– Я очень рад, что не поехал к посланнику, – говорил князь Ипполит: – скука… Прекрасный вечер, не правда ли, прекрасный?
– Говорят, что бал будет очень хорош, – отвечала княгиня, вздергивая с усиками губку. – Все красивые женщины общества будут там.
– Не все, потому что вас там не будет; не все, – сказал князь Ипполит, радостно смеясь, и, схватив шаль у лакея, даже толкнул его и стал надевать ее на княгиню.
От неловкости или умышленно (никто бы не мог разобрать этого) он долго не опускал рук, когда шаль уже была надета, и как будто обнимал молодую женщину.
Она грациозно, но всё улыбаясь, отстранилась, повернулась и взглянула на мужа. У князя Андрея глаза были закрыты: так он казался усталым и сонным.