Введение в Perl


От простого к сложному


От простого к сложному
От простого к сложному Прежде чем приступить к последовательному ознакомлению с не знакомым для вас языком, должен оговориться и сказать, что все примеры да и сам язык описанию которого посвящена...
Пример 1
Пример 1 #!/usr/local/bin/perl # Содержимое файла test1.pl print "Наше Вам с кисточкой!\n"; А теперь подробно разберем каждую строку. #!/usr/local/bin/perl Данная строка должна б...
Пример 2
Пример 2 #!/usr/local/bin/perl open(PASS, "</etc/passwd") || die "Файл не найден!"; while(<PASS>) { print; } close(PASS); Пояснения: open(PASS, "<...
Пример 3
Пример 3 #!/usr/local/bin/perl open(PASS, "</etc/passwd") || die "Файл не найден!"; while(&ltPASS>) { ($login, $pass, $uid, $gid, $name, $home_dir, $...
Пример 4
Пример 4 #!/usr/local/bin/perl open(PASS, "sort -n -t : +3 -4 +0 /etc/passwd|") || die "Файл не найден!"; while(<PASS>) { ($login, $pass, $uid, $gid, $name, $hom...
Переменные
Переменные. Контекст Скалярные значения Конструкторы скаляров Конструкторы списков Тип typeglobs В Perl существует три типа структур данных: скаляры, массивы скаляров и хеши (hashes) -...
Пример 1
Пример 1 $var1 # Простой скаляр 'var1' $var1[0] # Первый элемент массива 'var1' $var1{'first'} # Элемент с индексом 'first' В случае использования имени массива "целиком" или его &...
Пример 2
Пример 2 @var1 # Все элементы массива var1 ( $var1[0], $var1[1], ... $var1[n]) @var1[1,3,10] # Элементы $var1[1], $var1[3], $var1[10] @var1{'first','last'} # то же что и ( $var1{'first'}, $va...
Пример 3
Пример 3 %var, %key, %years Имена подпрограмм начинаются символом '&', если из контекста не видно, что это подпрограмма....
Пример 4
Пример 4 &sub1, &test_prog, test(12) Имена таблиц символов всегда начинаются символом '*'. Каждый тип переменных имеет свою область памяти поэтому $var1 и $var1[0] совершенно разные пер...
Контекст
Контекст. Большое значение для правильного употребления встроенных функций имеет контекст использования результата этих функций, т.к. в противном случае они возвращают совершенно "непонятны...
Пример 5
Пример 5 $var1 = <>; # Прочитать одну строку файла @var1 = <>; # Прочитать все строки файла в массив @var1 $var1 = (1,2,3); # $var = 3 - количество элементов @var1 = (1,2,3); # Соз...
Скалярные значения
Скалярные значения. Все данные в Perl это скаляры, массивы скаляров и хеши скаляров. Скалярные переменные могут содержать числа, строки и ссылки. Преобразование числа - строки происходит автомати...
Пример 6
Пример 6 @var1 = (4, 3, 2, 1); # Присвоение значения элементам массива $i = @var1; # Использование скалярного контекста print $i; # Печать результата 4 - кол-во элементов print @var1; # Спи...
Пример 7
Пример 7 print scalar(@var1); # Вывод длины массива а не его значений Хеш в скалярном контексте возвращает "true", если существует хотя бы одна пара "ключ-значение". Фактичес...
Конструкторы скаляров
Конструкторы скаляров. Числа пишутся стандартно: 123 123.123 0.12 .12E-10 0xABCD # Шестнадцатиричная запись 0377 # Если 0 в начале - восьмеричная 123_456_123 # Так тоже можно для удобст...
Пример 8
Пример 8 $var1{first} то же что и $var1{'first'} Обратите внимание на то, что перед первой одинарной кавычкой должен стоять пробел, иначе строка воспримется как имя переменной, т. к. в именах ра...
Пример 9
Пример 9 print <<EOF; # Все строки до EOF - текст для печати. Эй вы трое, идите двое сюда! Что стоишь! Я тебе говорю!! Полковник Савонькин. EOF...
Конструкторы списков
Конструкторы списков. Список - множество значений, перечисленных через запятую и заключенных в круглые скобки. В списковом контексте список возвращает последний элемент списка....
Пример 10
Пример 10 @var1 = (1, 2, 'привет', 1.2); # Присвоить значение элементам. где $var1[0] = 1, $var1[1] = 2, $var1[2] = 'привет' $var1[3] = 1.2 $var1 = (1, 2, 'привет', 1.2); а здесь $var...
Пример 11
Пример 11 @s1 = (1, 2, 3); # Первый список @s2 = (6, 7, 8); # Второй @s = (0, @s1, 4, 5, @s2, 9, 10); # Включаем списки @s1 и @s2 print @s; # Результат: 012345678910 - значения без пробелов....
Пример 12
Пример 12 print ('январь','февраль','март')[1]; Результат: февраль Список может быть присвоен списку только если каждый элемент в списке в левой части выражения допустим по типу списку в правой...
Пример 13
Пример 13 ($a, $b, $c) = (1, 2, 3); # $a = 1, $b = 2, $c = 3 Присваивание списков в скалярном контексте возвращает количество присвоенных элементов....
Пример 14
Пример 14 $x = (($a, $b, $c) = (1,2)); # Результат $x=2 В случае присваивания списка хешу, список рассматривается как пары: ключ-значение....
Пример 15
Пример 15 %дни_месяца = ('январь', 31, 'февраль', 30); Результат: $дни_месяца{январь} = 31, $дни_месяца{февраль} = 30 Для удобства записи можно использовать выражение с => ....
Пример 16
Пример 16 %дни_месяца = ( январь => 31, февраль => 30, );...
Тип typeglobs
Тип typeglobs В Perl используется специальный внутренний тип typeglog для записи массива всех переменных. Такие массивы начинаются с символа '*'. Их удобно применять для передачи ссылок на массив...
Отладка Perl программ
Отладка Perl программ. В Perl реализован превосходный механизм отладки программ. Вам достаточно запустить программу с ключом '-d' и вы начнете работать с интерактивным отладчиком. Вам становятся д...
Форматы
Форматы. В Perl реализован удобный метод создания форматированных отчетов. С помощью оператора format вы описываете заголовки, размеры полей, указываете положение данных на листе в удобной текстов...
Пример 1
Пример 1 #!/usr/local/bin/perl # # Программа печати пригласительного билета # $кому = "Чапаеву Василию Ивановичу"; $от_кого = "Компания МММ"; $адрес = "Москва, ул. Петровк...
Встроенные функции
Встроенные функции. Встроенные функции используются как термы выражений и подразделяются на две категории: списковые операторы и унарные операторы. Это влияет на их приоритет по отношению к операт...
Пример 1
Пример 1 print 1 + 2 + 3; # результат 6 print(1+2)+3; # результат 3 print (1+2)+3; # опять 3 print (1+2+3); # 6 Если функция возвращает результат как в скалярном так и в списковом...
Оператор 'X'
Оператор '-X'. -X указатель файла -X выражение -X Проверка файла, где 'X' - одно из ниже описанных значений. Это унарный оператор с одним аргументом - либо именем файла, либо указателем ф...
Abs выражение
abs выражение Абсолютное значение выражения...
Accept NEWSOCKET GENERICSOCKET
accept NEWSOCKET, GENERICSOCKET Открыть новый сокет по внешнему запросу. Аналогично системному вызову accept(). Возвращает адрес или false в случае неудачи....
Alarm секунды
alarm секунды Послать сигнал SIGALARM текущему процессу по истечении указанного промежутка времени. Не допустимо делать несколько вызовов одновременно в одном промежутке времени. Возвращает остат...
Atan2 Y X
atan2 Y, X Арктангенс отношения Y к X в пределах от -pi до +pi....
Bind сокет имя
bind сокет, имя Назначить сетевой адрес сокету. Подобно системному вызову bind. Возвращает true в случае успеха и false иначе. Имя - пакетный адрес сокета....
Binmode файл
binmode файл Открыть файл для двоичного (binary) режима доступа. В обычном режиме при вводе символы CR LF транслируются в LF, а при выводе LF транслируется в CR LF....
Bless ссылка класс bless ссылка
bless ссылка, классbless ссылка Данная функция определяет что объект указанный ссылкой принадлежит классу. Если класс не указан то он относится к текущему классу. Обычно это последний оператор в...
Caller выражение caller
caller выражениеcaller Возвращает контекст вызова текущей подпрограммы. В скалярном контексте true если это подпрограмма или процедура вызванная операторами eval() или require() и false - иначе....
Chdir выражение
chdir выражение Перейти в директорию указанную выражением. Если выражение отсутствует то перейти в "домашнюю" директорию. Возвращает true в случае успеха и false - неудачи....
Chmod список
chmod список Изменить права доступа к файлам указанным в списке. Первый элемент в списке - числовое ,обычно восьмеричное значение прав. Возвращает количество файлов которым были изменены права....
Пример 2
Пример 2 chmod 0666 'f1', 'f2', 'f3';...
Chomp переменная chomp список chomp
chomp переменнаяchomp списокchomp Удаляет в конце строки символ указанный переменной $/. Обычно это 'LF'. Возвращает количество удаленных символов. Если переменная не указана то используется пере...
Chop переменная chop список chop
chop переменнаяchop списокchop Полностью аналогично функции chomp но всегда удаляет последний символ строки....
Chown список
chown список Изменить "владельца" и "группу" файлов списка. Первый элемент - номер нового владельца, второй номер новой группы а далее список файлов. В большинстве Unix-систем...
Chr число
chr число Возвращает символ с указанным кодом кодировки....
Chroot директория
chroot директория Сделать "корневой" указанную директорию. "Корневая" - значит внутри программы на нее можно ссылаться как '/'....
Close файл
close файл Закрыть открытый файл или поток. Можно не использовать, если один и тот же файл открывается повторно, т.к. он будет автоматически закрываться новым вызовом open()....
Closedir директория
closedir директория Закрыть директорию, открытую функцией opendir()....
Connect сокет имя
connect сокет, имя Связаться с удаленным сокетом. Данная функция подобна системному вызову connect(). Возвращает true в случае успеха и false при ошибке....
Cos выражение
cos выражение Косинус выражения в радианах....
Crypt текст salt
crypt текст, salt Шифрация текста. Аналогично системному crypt()....
Dbmclose хеш
dbmclose хеш Закрывает связь между хеш и базой данных....
Dbmopen хеш база режим
dbmopen хеш, база, режим Ассоциировать указанный хеш и базу в определенном режиме. Дело в том, что в Perl реализован очень удобный механизм работы с базами данных типа dbm, ndbm, sbdm, gdbm и Ber...
Define выражение
define выражение Возвращает true, если значение определено (существует) и false, если нет. Многие операции завершаются неопределенным значением, например чтение после конца файла, использование н...
Delete выражение
delete выражение Удалить значение из хеша. Возвращает удаляемое значение или неопределенность, если ничего не удаляется. Удаление из массива окружения $ENV{} - изменяет окружение. Удаление из хеш...
Die список
die список Если программа не была запущена из eval(), данная функция выводит список в поток STDERR и завершает работу программы с кодом из переменной $!. Если $! содержит 0, то с кодом ($? >&g...
Do BLOCK
do BLOCK Это не совсем функция. Здесь возвращается значение последнего оператора блока. Когда используется циклический модификатор BLOCK исполняется перед проверкой условия цикла в отличии от обы...
Do подпрограмма
do подпрограмма Устаревший метод вызова подпрограмм....
Do выражение
do выражение Значение выражения воспринимается как имя файла Perl скрипта. Изначально это применялось для включения подпрограмм библиотеки. Сейчас правильней использовать вызовы use() и require()...
Dump метка
dump метка Выполнение "дампа" текущей памяти. Применялось для возможности использовать программу undump, чтобы включить текущий исполняемый код в программу после инициализации всех пере...
Each хеш
each хеш Возвращает 2-элементный массив. Первый элемент - ключ второй - значение следующего элемента хеша. Позволяет "просматривать" все значения хеша в определенном порядке. Сброс пере...
Eof файл eof() eof
eof файлeof()eof Возвращает 1, если выполняется чтение после конца или чтение из не открытого файла. Аргументом должно быть выражение, возвращающее существующий указатель файла. Данную функцию не...
Eval выражение eval блок
eval выражениеeval блок Выражение сканируется и выполняется как обычная Perl программа. Это делается в контексте текущей программы, поэтому можно использовать уже определенные переменные и подпро...
Exec список
exec список Выполняется системная команда из списка, и выполнение программы завершается. Если вам необходимо вернуться, то лучше применяйте функцию system(). Если в списке количество аргументов б...
Exists выражение
exists выражение Возвращает true, если существует указанный ключ хеша, даже если не определено его значение....
Exit выражение
exit выражение Выполнение программы завершается с кодом выражения....
Exp выражение
exp выражение Возвращает e (основание натурального логарифма) в степени выражения....
Fcntl файл функция скаляр
fcntl файл, функция, скаляр Выполняет системный вызов fcntl(). Для использования обязательно выполнить use Fcntl;...
Fileno файл
fileno файл Возвращает описатель файла для данного указателя файла....
Flock файл операция
flock файл, операция Системный вызов flock()...
Fock
fock Системный вызов fock(). Возвращает pid потомка для родителя и 0 - для потомка в случае успеха, иначе - неопределенное значение....
Format
format Декларативная функция Perl. Определяет формат вывода для оператора write. Подробно смотрите главу Форматы....
Formline формат список
formline формат, список Внутренняя функция, используемая в format. Форматирует вывод параметров из списка. Результат помещается в переменную $^A Функция write просто выводит значение этой переменн...
Getc файл getc
getc файлgetc Читает и возвращает символ из указанного файла. Если файл не указан, то читается STDIN. После конца файла возвращает пустую строку....
Getlogin
getlogin Возвращает текущий login из файла /etc/utmp Не применяйте для идентификации пользователя, он не так сильно "закрыт" как getpwuid()....
Getpeername сокет
getpeername сокет Возвращает упакованный адрес удаленного сокета....
Getpgrp PID
getpgrp PID Возвращает группу процесса с указанным PID. Если аргумент отсутствует, возвращает группу текущего процесса....
Getppid
getppid Возвращает PID родительского процесса....
Getpriority WHICH WHO
getpriority WHICH, WHO Возвращает текущий приоритет процесса, группы процессов или пользователя....
Группа системных вызовов
Группа системных вызовов: getpwnam NAME getgrnam NAME gethostbyname NAME getnamebyname NAME getprotobyname NAME getpwuid UID getgrid GID getservbyname NAME, PROTO gethostbyaddr...
Getsockname сокет
getsockname сокет Возвращает упакованный адрес сокета локальной машины....
Getsockopt сокет уровень опция
getsockopt сокет, уровень, опция Возвращает опцию сокета....
Glob выражение
glob выражение Возвращает список файлов, удовлетворяющих выражению с '*', как в команде ls....
Gmtime выражение
gmtime выражение Переводит местное время, полученное функцией time(), во время по Гринвичу. Обычно используется в виде: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime(time);...
Goto метка goto выражение goto &подпрограмма
goto меткаgoto выражениеgoto &подпрограмма Безусловный переход на метку. Нельзя делать переход на метку в структуру, которая должна быть инициирована, например, подпрограмму или цикл foreach...
Grep блок список grep выражение список
grep блок, списокgrep выражение, список Выполнят блок или выражение для каждого элемента списка. Переменная $_ содержит текущий элемент. Возвращает список элементов, с которыми выражение дало рез...
Hex выражение
hex выражение Воспринимает выражение как строку шестнадцатеричных цифр и возвращает десятичное значение....
Import
import В Perl нет встроенной функции import, но есть метод, с помощью которого модули могут экспортировать область имен другим модулям. Подробно смотрите функцию use()....
Index строка подстрока позиция index строка подстрока
index строка, подстрока, позицияindex строка, подстрока Возвращает позицию первого вхождения подстроки в строке, начиная с указанной позиции. Если позиция отсутствует, то сравнение начинается с н...
Int выражение
int выражение Возвращает целую часть выражения....
Ioctl FILEHANDLE FUNCTION SCALAR
ioctl FILEHANDLE, FUNCTION, SCALAR Выполняет системный вызов ioctl(). В начале программы необходимо указать: require "ioctl.ph";...
Join выражение список
join выражение, список Соединяет строки списка или массива в одну строку с кодом разделителя, равному выражению....
Keys хеш
keys хеш Возвращает массив всех ключей хеша. В скалярном контексте - количество ключей. Порядок следования ключей аналогичен порядку в each функции....
Kill список
kill список Послать сигнал (первый элемент) указанным в списке процессам. Возвращает количество процессов которые сигнал приняли....
Last метка last
last меткаlast Функция аналогичная break в С. Прерывает цикл и переходит на указанную метку. Если метки нет на ближайший внешний цикл. Блок continue не выполняется....
Lc выражение
lc выражение Преобразовать строку в буквы нижнего регистра....
Lcfirst выражение
lcfirst выражение Заменить первую букву строки на малую....
Length выражение
length выражение Возвращает длину строки выражения....
Link OLDFILE NEWFILE
link OLDFILE, NEWFILE Создать файл NEWFILE связанный с файлом OLDFILE....
Listen SOCKET QUEUESIZE
listen SOCKET, QUEUESIZE Выполнить системный listen()....
Local список
local список Объявляет перечисленные переменные как локальные в текущем блоке или подпрограмме. Если указано два и более имени, их необходимо заключить в круглые скобки. Предпочтительней использо...
Localtime выражение
localtime выражение Преобразовать 9-элементный массив, возвращаемый функцией time, относительно местного времени. Употребляется как: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=loca...
Log выражение
log выражение Возвращает натуральный логарифм выражения....
Lstat файл lstat выражение
lstat файлlstat выражение То же что и системный вызов stat(), но касательно ссылки на файл, а не самого файла....
M//
m// Оператор совпадения. Смотри главу Операторы...
Map блок список map выражение список
map блок, списокmap выражение, список Выполняет блок или выражение для каждого элемента списка. Возвращает список результатов....
Mkdir директория права
mkdir директория, права Создать директорию с указанными правами доступа. Возвращает 1 при успехе, и 0 при неудаче....
Msgctl ID CMD ARG
msgctl ID, CMD, ARG Системный вызов msgctl() System V...
Msgget KEY FLAGS
msgget KEY, FLAGS Системный вызов msgget() System V...
Msgsnd ID MSG FLAGS
msgsnd ID, MSG, FLAGS Системный вызов msgsnd() System V...
Msgrcv ID VAR SIZE TYPE FLAGS
msgrcv ID, VAR, SIZE, TYPE, FLAGS Системный вызов msgrcv() System V...
My список
my список Объявляет локальными переменные в списке. Если два или более имени, их необходимо заключить в круглые скобки....
Next метка next
next меткаnext Аналогичен continue в С. Переход к следующей итерации в цикле. Если в цикле присутствует блок continue, он так же выполняется. Если метка отсутствует - переход на ближайший внутрен...
No Module список
no Module список. Исключить использование указанных модулей....
Oct выражение
oct выражение Возвращает десятичное число, представленное восьмеричными цифрами....
Open файл выражение open файл
open файл, выражениеopen файл Открыть файл с указанным именем. Аргумент "файл" - это фактически указатель на блок описания файла. Если имя (выражение) файла отсутствует, то имя считаетс...
Opendir указатель выражение
opendir указатель, выражение Открыть директорию с именем выражения для обработки функциями readdir(), telldir(), seekdir(), rewinddir() и closedir(). Возвращает true при успехе....
Ord выражение
ord выражение Возвращает ascii код первого символа выражения....
Pack шаблон список
pack шаблон, список Упаковывает список в двоичную структуру по шаблону. Шаблон - это строка символов, описывающая порядок и тип упакованных значений. A - текстовая строка, добавляется пробе...
Пример 3
Пример 3 print(pack("ccc",65,66,67)); # Результат ABC print(pack("A4A3","ab","cdefg")); # "ab cde" print(pack("a4a3","ab...
Pipe READHANDLE WRITEHANDLE
pipe READHANDLE, WRITEHANDLE Аналогичен системному pipe()....
Pop массив
pop массив Удаляет и возвращает последний элемент массива. Длина массива уменьшается на 1. Результат не определен, если массив пустой. Если имя массива отсутствует, то извлекает из @ARGV для голо...
Pos скаляр
pos скаляр Возвращает смещение от последнего m//g поиска....
Print файл список print список print
print файл списокprint списокprint Выводит строку или список строк в файл. Возвращает true при успехе. Аргумент файл может быть скалярной переменной, содержащей имя указателя файла, если он отсут...
Printf файл список printf список
printf файл списокprintf список Аналогичен вызову "print файл sprintf(список)". Первый элемент списка должен быть форматом printf(), как и в С....
Push массив список
push массив, список Добавить элементы массива значениями из списка. Длина массива увеличивается на количество элементов списка....
Q/строка/ qq/строка/ qx/строка/ qw/строка/
q/строка/qq/строка/qx/строка/qw/строка/ Обычные операторы строк. Смотри главу Операторы....
Quotemeta выражение
quotemeta выражение Вычисляет выражение, в котором метасимволы рассматриваются как обычные символы....
Rand выражение rand
rand выражениеrand Возвращает случайное число в диапазоне между 0 и выражением. Если выражение отсутствует - между 0 и 1. Данная псевдослучайная последовательность сбрасывается функцией srand()....
Read файл скаляр длина смещение read файл скаляр длина
read файл, скаляр, длина, смещениеread файл, скаляр, длина Прочитать указанное число байт из файла в скалярную переменную. Возвращает количество прочитанных байт или неопределенность при ошибке....
Readdir директория
readdir директория Возвращает имя следующего файла в директории открытой командой opendir(). В скалярном контексте возвращает все оставшиеся имена файлов. Если файлов больше нет, то возвращает не...
Readlink выражение
readlink выражение Возвращает значение символической ссылки. При ошибке возвращает неопределенное значение....
Recv SOCKIT SCALAR LEN FLAGS
recv SOCKIT, SCALAR, LEN, FLAGS Получить сообщение из сокета. Аналогичен системному recvfrom()....
Redo метка redo
redo меткаredo Перейти к началу блока, минуя вычисление условия и блока continue. Если метка отсутствует, то переход к ближайшему внешнему блоку....
Ref выражение
ref выражение Возвращает true, если выражение это ссылка, иначе - false. Возвращаемое значение зависит от типа ссылки. Существуют следующие типы ссылок: REF, SCALAR, ARRAY, HASH, CODE, GLOB...
Rename старое_имя новое_имя_файла
rename старое_имя, новое_имя_файла Переименовать файл. Возвращает 1 в случае успеха, иначе - 0....
105Require выражение require
105require выражениеrequire Если выражение - число, требует что бы текущая версия Perl была не ниже указанной. Если строка - считывает библиотечный файл с указанным именем, если он еще не прочита...
Reset выражение reset
reset выражениеreset Обычно используется в блоках continue циклов для очистки переменных и поиска для повторного применения. Выражение воспринимается как список символов. Для указания диапазона м...
Пример 4
Пример 4 reset 'a'; # очистить все переменные начинающиеся # буквой 'a' reset 'a-z' # все переменные с малых букв. Выражение вида: 'A-Z' употреблять не рекомендуется, т.к. обнул...
Return список
return список Выход из подпрограммы с указанным кодом. Если данная функция отсутствует, то выход из подпрограммы осуществляется с кодом последнего выполненного оператора....
Reverse список
reverse список В списковом контексте возвращает список с элементами в обратном порядке указанному списку. В скалярном контексте возвращает строку с переставленными символами первого элемента спис...
Rewindir директория
rewindir директория Устанавливает указатель файлов открытой директории в начало для последующего чтения функцией readdir()....
Rindex строка подстрока позиция rindex строка подстрока
rindex строка, подстрока, позицияrindex строка, подстрока Подобна функции index , но возвращает позицию последнего вхождения подстроки в строку. Если указана позиция, то просмотр выполняется до н...
Rmdir директория
rmdir директория Удалить указанную директорию, если в ней нет никаких файлов. Возвращает 1 при успехе и 0 - при неудаче. При этом переменная $! содержит код (errno)....
S///
s/// Оператор подстановки. Смотри главу Операторы....
Scalar выражение
scalar выражение Вычисляет выражение в скалярном контексте и возвращает результат. В Perl нет специальной функции для принудительного вычисления в списковом контексте, т.к. для достаточно заключи...
Seek файл позиция отсчет
seek файл, позиция, отсчет Установить указатель на произвольную позицию в файле. Если отсчет равен 0 - позиционировать от начала файла, если 1 - от текущего положения, 2 - от конца файла. Возвращ...

Работа в Microsoft Outlook XP см. раздел
Иллюстрированный самоучитель по Outlook2002 см. раздел


- Начало -



Книжный магазин