Спецификация языка Perl

         

Local EXPR



local EXPR

На самом деле гораздо эффективнее использовать функцию my. Функция local делает перечисленные переменные локальными в блоке, подпрограмме, eval или do. Если переменных более, чем одна, то они должны объединяться скобками. sub RANGEVAL{ local($min,$max,$thunk) = @_; local $result = ''; local $i; for ($i = $min; $i < $max; $i++) { $result = eval $thunk; } $result; }



Log EXPR



log EXPR

Возвращает натуральный логарифм EXPR, по умолчанию обрабатывает переменную $_.



Map EXPR,LIST



map EXPR,LIST

Подставляет каждый элемент из списка LIST в EXPR (которое может быть блоком) и возвращает список полученных после обработки величин. @chars = map(chr, @nums);



Mkdir FILENAME,MODE



mkdir FILENAME,MODE

Создает директорию с именем FILENAME и правами доступа указанными в переменной MODE. В случае успеха возвращает 1, в противном случае возвращает 0 и устанавливает значение переменной $!(errno).



My EXPR



my EXPR

Эта функция (так же как и описанная ранее функция local) делает перечисленные переменные локальными в пределах блока, подпрограммы, eval или do. Если список состоит более чем из одного элемента, то он должен быть заключен в скобки. Все элементы в списке должны быть фактическими параметрами. В отличие от local, переменные локализованные функцией my не видны снаружи блока, подпрограммы или другой конструкции, внутри которой my употребляется.



Next LABEL





next LABEL

Употребляется подобно continue оператору в C - запускает следующую итерацию цикла. line: while (<STDIN>) { next line if /^#/; ... }



Oct EXPR



oct EXPR

Возвращает десятичное значение EXPR, интерпретируемого как строка в восьмеричном формате. (Если строка начинается с 0x, то интерпретируется, как строка в шестнадцатеричном формате.)



Open DIRHANDLE,EXPR



open DIRHANDLE,EXPR

Открывает директорию с именем EXPR, возвращает TRUE в случае успеха.



Open FILEHANDLE,EXPR



open FILEHANDLE,EXPR

Открывает файл, имя которого описано в переменной EXPR и привязывает его к FILEHANDLE. Если EXPR опущено, то переменная с таким же именем как FILEHANDLE содержит имя файла. Если имя файла начинается со знака: ¯ < файл открывается на чтение. > файл открывается на запись. >> файл открывается для добавления. | имя файла расценивается как команда, с которой будет организован программный канал, то есть вывод в дескриптор FILEHANDLE будет передаваться на вход программе EXPR.

Если знак | указывается после имени команды, то вывод этой команды будет ассоциирован с дескриптором FILEHANDLE, из которого будет производиться чтение. Интересно, что нельзя открыть двойной программный канал, то есть ассоциировать ввод и вывод команды с дескриптором файла (что соответствовало бы системному вызову popen в UNIX).

В случае, когда имя файла оканчивается вертикальной чертой, оно расценивается как имя команды, вывод которой будет интерпретироваться как ввод из файла (аналог функции popen(3)). open(LOG, '>>/usr/spool/news/twitlog');



Ord EXPR



ord EXPR

Возвращает числовое значение в таблице ASCII первого символа EXPR. По умолчанию обрабатывает переменную $_.



П2.1.1 Введение



П2.1.1 Введение

Perl - интерпретируемый язык, приспособленный для обработки произвольных текстовых файлов, извлечения из них необходимой информациии и выдачи сообщений. Perl также удобен для написания различных системных программ. Этот язык прост в использовании, эффективен, но про него трудно сказать, что он элегантен и компактен. Perl сочитает в себе лучшие черты C, shell, sed и awk, поэтому для тех, кто знаком с ними, изучение Perl-а не представляет особого труда. Cинтаксис выражений Perl-а близок к синтаксису C. В отличие от большинства утилит ОС UNIX Perl не ставит ограничений на объем обрабатываемых данных и если хватает ресурсов, то весь файл обрабатывается как одна строка. Рекурсия может быть произвольной глубины. Хотя Perl приспособлен для сканирования текстовых файлов, он может обрабатывать так же двоичные данные и создавать .dbm файлы, подобные ассоциативным массивам. Perl позволяет использовать регулярные выражения, создавать объекты, вставлять в программу на С или C++ куски кода на Perl-е, а также позволяет осуществлять доступ к базам данных, в том числе Oracle.

Ниже приводится в качестве примера небольшая программа, которая осуществляет доступ к Oracle. #! /usr/local/bin/perl -w # запуск с ключом печати ошибок. use Oraperl; # подключение модуля для работы с Oracle $system_id = 'T:bdhost.somwere.com:Base'; # описание имени базы данных $lda = &ora_login($system_id, 'scott','tiger'); # подключение к базе данных пользователя # scott с паролем tiger $statement = 'create table MYTABLE (NAME char(10), TITLE char(20), ORGANIZATION varchar2(256))'; # SQL команда создания таблицы MYTABLE $csr = &ora_open($lda, $statement) die $ora_errstr; # открытие курсора csr, если это невозможно, # то осуществляется выход и печать сообщения об ошибке. &ora_close($csr); # закрытие курсора open(FL, '/home/my_home_directory/my_file') die "Can't open file \n"; # открытие файла, если это невозможно, # то выход с печатью сообщения об ошибке while ($string = <FL>) { # чтение входного потока из файла с дескриптором FL @array = split(/\//,$string); # считанная строка разбивается в массив # строк, разделителем служит слеш $st = 'insert into MYTABLE values(:1,:2,:3)'; # SQL команда помещения в таблицу некоторых значений $csr = &ora_open($lda,$st) $ora_errstr; # открытие курсора или печать # сообщения об ошибке и выход &ora_bind($csr,$array[0],$array[1],$array[2]); # привязка значений переменных к величинам, которые # требуется поместить в таблицу &ora_close($csr); # закрытие курсора } close FL; # закрытие файла &ora_commit($lda); # завершение транзакции в базе данных &ora_logoff($lda); # отключение от базы данных



П2.2.1 Скалярные величины



П2.2.1 Скалярные величины

Скалярные переменные могут содержать различные простые типы данных, такие как числа, строки или ссылки. Они не могут содержать сложные типы, но могут содержать ссылку на массив или хэш. В булевском контексте скаляр принимает значение TRUE, если он содержит не нулевое число или не пустую строку. В Perl существует несколько способов записи чисел: ¯ 12345

12345.67

.23E-10

0xffff шестнадцатеричная запись 0377 восьмеричная запись. 1_234_567_890 подчерк для удобства чтения.

Строки заключаются в одинарные или двойные кавычки. Использование кавычек в Perl такое же как в bourne shell-е: строка в двойных кавычках обрабатывается и вместо переменных подставляются их значения, а также обрабатываются бакслэш-последовательности, строки в одинарных кавычках рассматривается просто как последовательности символов. Используются также: ¯ \t табуляция \n перевод строки \r возврат каретки \b пробел \e символ Escape \033 восьмеричный формат \x1b шестнадцатеричный формат \c[ управляющая последовательность (control) \a сигнал (alarm) \f переход на следующую страницу



П2.2.2 Простые массивы



П2.2.2 Простые массивы

Perl позволяет произвольно удлинять массив путем обращения к элементу, индекс которого больше, чем последний индекс массива. Так же можно произвольно уменьшить длину массива.

@day = ('a','b');

$day[3] = 'c';

Теперь массив day содержит три элемента: ('a','b','c').

@day = (); или, что то же самое: $#day = -1;

Теперь массив day пуст.

(@day, @month, &SomeSub) содержит в себе элементы массива day, за ними следуют элементы массива month, а за ними результат выполнения подпрограммы SomeSub. Пустой массив обозначается (). Массив ((),(),(),()) эквивалентен пустому массиву. Последний элемент массива может быть массивом или хэшэм:

($a, $b, @c)= split;

($a, $b, %c)= @_;

Любой элемент массива может быть массивом.



П2.2.3 Ассоциативные массивы



П2.2.3 Ассоциативные массивы

Ассоциативные массивы или хэши содержат пары ``ключ'' и ``значение''. Например: \%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);

Часто для удобства чтения между ``ключом'' и ``значением'' ставят оператор =>. %map = ( 'red' => 0x00f, 'blue' => 0x0f0, 'green' => )xf00 );



П2.2 Cтруктуры данных



П2.2 Cтруктуры данных

Perl поддерживает три типа данных:

скаляры массивы скаляров ассоциативные массивы скаляров (так называемые хэши).

Обычные массивы, как и в языке C, индексируются числами, начиная с нуля. Ассоциативные массивы индексируются строками. Простые скаляры (в дальнейшем мы будем также называть их переменными) всегда начинаются со знака доллара: $, даже в том случае, когда мы обращаемся к элементу массива. ¯ $day простая переменная day

$day[28] 29 элемент массива day

$day{'Feb'} значение 'Feb' из хэша %day

$#day последний индекс массива @day

Простой массив начинается со знака @: ¯ @day массив day - ($day[1],$day[2],...)

@day[3,4,5] то же, что и @day[3..5]

Ассоциативный массив (хэш) начинается со знака процент %:

%day (key1, val1, key2, val2, ...)

Каждый тип данных имеет свое именное пространство, поэтому вы можете использовать одно и то же имя одновременно для скалярной переменной, массива или хэша (а также для подпрограммы или метки) без опасения, что произойдет ошибка. Perl различает большие и маленькие буквы: FOO, foo и Foo будут рассматриваться Perl-ом как разные переменные. Имена, начинающиеся с буквы или знака подчеркивания, могут в дальнейшем содержать в себе цифры или знаки подчеркивания. Имена, начинающиеся с цифры, могут в дальнейшем содержать только цифры. Имена, начинающиеся не с буквы, цифры или подчерка должны состоять только из одного символа. Большинство таких имен зарезервировано, например $$ является идентификатором текущего процесса. Интерпретация команды или величины часто зависит от требований контекста. Существует два основных контекста: скалярный и списковый. Некоторые операции возвращают список величин если в контексте подразумевается список и одну величину, если контекст скалярный. Например, операция &ora_fetch в скалярном контексте возвращает количество выбранных строк:

$nfields = &ora_fetch($csr);

В списковом контексте она возвращает массив выбранных строк:

@array = &ora_fetch($csr);

Левый аргумент определяет контекст правого аргумента.



П2.3.1 Основные понятия



П2.3.1 Основные понятия

Программа на Perl-е состоит из последовательности команд. В отличие от типизированных языков Perl не требует объявления типов своих объектов. Все объекты, определенные в программе, до присваивания им какого-либо значения по умолчанию принимают значение ``0''. Последовательность команд исполняется сразу, в отличие от sed и awk, где исполняется последовательно каждая строка. Комментарии выделяются знаком #, и вся строка следующая за этим знаком будет рассматриваться как комментарий. Если вы написали подпрограмму, то ее можно вызывать только ниже по тексту программы. Блоком называется последовательность операторов, логически составляющая единое целое в теле программы, как правило, блоки заключаются в фигурные скобки. Каждая команда отделяется от других точкой с запятой. Точка с запятой не обязательна, только если оператор является последним в блоке.



П2.3.2 Простые операторы



П2.3.2 Простые операторы

Последовательность простых операторов может следовать за отдельным модификатором. В Perl-е простыми модификаторами являются:

if (EXPR)

unless (EXPR)

while (EXPR)

until (EXPR) В операторах while и until проверка условия происходит перед выполнением тела блока, за исключением одного случая, когда используется do-оператор:

do { $_ = <STDIN>; ... } until $_ eq ".\n";

в котором проверка условия происходит после выполнения блока. Операторы цикла, которые будут описаны далее, не будут работать в этой конструкции, так как отсутствует метка цикла.



П2.3.3 Составные операторы



П2.3.3 Составные операторы

if (EXPR) BLOCK

if (EXPR) BLOCK else BLOCK

if (EXPR) BLOCK eslif (EXPR) BLOCK else BLOCK

LABEL: while (EXPR) BLOCK

LABEL: while (EXPR) BLOCK continue BLOCK

LABEL: for (EXPR; EXPR; EXPR;...) BLOCK

LABEL: foreach VAR(LIST) BLOCK

LABEL: BLOCK continue BLOCK

В отличие от C и Pascal все определяется в терминах блоков, а не операторов: то есть фигурные скобки являются обязательными. Метка состоит из идентификатора и двоеточия. Она ставится в начале цикла и служит указателем для операторов цикла next, last и redo (их описание смотри ниже). Если это continue блок, то он выполняется перед тем, как условие будет проверено снова, как третья часть for оператора в C. Правильность условия может зависеть от результатов выполнения блока, например: $i = 1; while ($i < 10){ ... } continue { $i++; }

или, что тоже самое: for ($i = 1; $i < 10; $i++;) { ... }

Foreach цикл присваивает переменной по очереди каждое значение из списка и выполняет над ней все команды из блока. Переменная является локальной и существует только в пределах данного цикла. Если список является массивом, то его можно изменять в цикле, посредством операций над переменной. Если переменная опускается, то по умолчанию в качестве нее используется $_. foreach \$elem(@elements) \{\$elem = \$elem * 2;\}

-- цикл по всему содержимому массива @items. Пример: for ((1,2,3,4,5,6,7,8,9,10,'boom')) { print $_,"\n"; sleep(1); } for (1..15) { print "Merry Christmas\n"; } foreach $item (split(/[\/\*\\n]/,$ENV{'TERMCAP'})) { print "Item: $item\n"; }

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



П2.3.4.1 Термы и операторы списка



П2.3.4.1 Термы и операторы списка

Операторы в Perl-е имеют различный приоритет. Операторы, заимствованные из C, сохранили между собой ту же иерархию, что и в C. Термы имеют самый большой приоритет, они содержат переменные, кавычки, выражения в скобках, функции с их параметрами. Если за списковым оператором ( например, print()) или унарным оператором ( например, chdir()) следует список аргументов, заключенный в скобки, то эта последовательность имеет самый высокий приоритет, подобно функции с аргументами. Аналогично термам обрабатываются последовательности do{} и eval{}.



П2.3.4.2 Оператор ``стрелка''



П2.3.4.2 Оператор ``стрелка''

Также, как в С и С++ ``->'' является инфиксным оператором ссылки. Если правая часть является [...] или {...} подпрограммой, тогда левая часть должна быть символьной ссылкой на массив или хэш. Если правая часть - это имя метода или скалярная переменная содержащая имя метода, то левая часть должна быть объектом или именем класса.



П2.3.4.3 Операторы ++ и - -



П2.3.4.3 Операторы ++ и - -

Эти операторы работают также как и в С. То есть, если они стоят перед переменной, то они увеличивают или уменьшают переменную до возвращения значения. Если они стоят после переменной, то увеличение или уменьшение переменной происходит после возврата значения. Если переменная содержит в себе число или употребляется в скалярном контексте, то использование ++ дает обычное увеличение значения. Если же переменная употреблялась только в строковом контексте, не является пустой строкой и содержит символы a-z,A-Z,0..9, то происходит строковое увеличение значения переменной:

print ++($foo = '99'); - напечатает 100

print ++($foo = 'a0'); - напечатает a1

print ++($foo = 'Az'); - напечатает Ba

print ++($foo = 'zz'); - напечатает aaa



П2.3.4.4 Экспоненциальный оператор



П2.3.4.4 Экспоненциальный оператор

В Perl-е двойная звездочка ** является экспоненциальным оператором. Он требует к себе даже больше внимания, чем унарный минус: -2**4 это -(2**4), но не (-2)**4.



П2.3.4.5 Символьные унарные операторы



П2.3.4.5 Символьные унарные операторы

Унарный ! означает логическое отрицание. Унарный минус, в случае числового значения переменной, обозначает обычное арифметическое отрицание. Если операндом является идентификатор, то возвращается строка, состоящая из знака минус и идентификатора. Если строка начинается со знака + или -, то возвращается строка, начинающаяся с противоположного знака. Унарная тильда ``~'' обозначает побитовое отрицание.

Унарный плюс не имеет влияния даже на строки. Он используется для отделения имя функции от выражения заключенного в скобки, которое иначе рассматривается как список аргументов. rand (10) * 20; - (rand10) * 20; rand +(10) * 20; - rand(10 * 20);

Унарный бэкслэш ``'' обозначает ссылку на то, что стоит за ним.



П2.3.4.6 Операторы связки



П2.3.4.6 Операторы связки

Знак равенства с тильдой ``=~''связывает выражение слева с определенным шаблоном. Некоторые операторы обрабатывают и модифицируют переменную $_. Эти же операции иногда желательно бывает выполнить над другой переменной. Правый аргумент это образец поиска, подстановки или трансляции, левый аргумент - это то, что должно быть подставлено вместо $_. Возвращаемая величина показывает успех операции. Бинарное ``!~'' это тоже самое, что и ``=~'', только возвращаемая величина является отрицательной в логическом смысле.



П2.3.4.7 Бинарные операторы



П2.3.4.7 Бинарные операторы

Звездочка * - умножение двух чисел. Cлэш / - деление числа на число. Процент % - вычисляет модуль двух чисел, x - оператор повторения. В скалярном контексте возвращает строку, состоящую из многократно повторенного левого операнда, причем повторяется он то количество раз, которое стоит справа. В списковом контексте он многократно повторяет список. print 'a' x 80; напечатает букву a 80 раз.

@ones = (1) x 80; массив из восьмидесяти единиц.

@ones = (5) x @ones сделает все элементы равными пяти.

Бинарный плюс - операция сложения двух чисел.

Бинарный минус - операция вычитания двух чисел.

Бинарная точка - конкатенация строк.



П2.3.4.8 Операторы сдвига



П2.3.4.8 Операторы сдвига

Двоичный сдвиг осуществляется, как и во многих других языках программирования, с помощью операторов ``<<'' и ``>>''. При применении этих операторов значения левых аргументов сдвигаются в соответствующую сторону на количество разрядов, указанное в правых аргументах. Аргументы должны быть целочисленными.



П2.3.4.9 Операторы сравнения



П2.3.4.9 Операторы сравнения

``<'' - возвращает TRUE если левый аргумент численно меньше, чем правый.

``>'' - возвращает TRUE если правый аргумент численно меньше, чем левый.

``<='' - возвращает TRUE если правый аргумент численно меньше или равен левому.

``>='' - возвращает TRUE если левый аргумент численно меньше или равен правому.

``gt'' - возвращает TRUE если левый аргумент меньше (в строковом контексте), чем правый.

``lt'' - возвращает TRUE если правый аргумент меньше (в строковом контексте), чем левый.

На поведение операторов lt и gt влияют установки системного языка, если операционная система способна работать с несколькими языками. По этой причине операторы должны корректно работать со строками на языках, отличных от US ASCII, что в системе UNIX задается указанием свойств LC_COLLATE системного locale.



П2.3.4.10 Операторы эквивалентности



П2.3.4.10 Операторы эквивалентности

== возвращает TRUE, если левый аргумент численно эквивалентен правому.

!= возвращает TRUE, если левый аргумент численно неэквивалентен правому.

<=> возвращает -1, 0 или 1 в зависимости от того, численно меньше, равен или больше левый аргумент правого.

eq возвращает TRUE, если левый аргумент эквивалентен правому (в строковом контексте).

ne возвращает TRUE, если левый аргумент неэквивалентен правому (в строковом контексте).

cmp возвращает -1, 0 или 1 в зависимости от того, меньше равен или больше левый аргумент правого (в строковом контексте).



П2.3.4.11 Побитовое И, побитовое ИЛИ и Исключающее ИЛИ



П2.3.4.11 Побитовое И, побитовое ИЛИ и Исключающее ИЛИ

Бинарное & возвращает объединенные побитово операнды.

Бинарное | возвращает перемноженные побитово операнды.

Бинарное ^ возвращает исключенные побитово операнды.



П2.3.4.12 Логическое И и логическое ИЛИ



П2.3.4.12 Логическое И и логическое ИЛИ

Бинарное && - логическое И. Если левый аргумент FALSE, то правый не проверяется.

Бинарное - логическое ИЛИ. Если левый аргумент TRUE, то правый аргумент не проверяется.

''и && отличаются от подобных операторов в \verbC| тем, что вместо 0 или 1 они возвращают последнюю обработанную величину. Таким образом, наиболее удобным способом определить домашний каталог пользователя из переменной окружения HOME будет (на практике такой способ определения домашнего каталога пользователя не рекомендуется): $home = $ENV{'HOME'} $ENV{'LOGDIR'} (getpwuid($<))[7] die "You're homeless!\n";

В качестве более удобной для чтения альтернативы Perl поддерживает операторы and и or, которые будут описаны далее. Их приоритет ниже, однако их можно с удобством использовать, не расставляя скобки, после операторов, аргументами которых являются списки: unlink "alpha", "beta", "gamma" or gripe(), next LINE;

Если писать в стиле C, то это может быть записано так: unlink("alpha", "beta", "gamma") (gripe(), next LINE);



П2.3.4.13 Оператор диапазона



П2.3.4.13 Оператор диапазона

.. - оператор диапазона. Реально это два разных оператора, в зависимости от контекста. В списковом контексте он работает как оператор диапазона от левого аргумента до правого. for (1..10) { #code }

В скалярном контексте он возвращает булевское значение. Если левый операнд TRUE, то .. принимает значение TRUE, если правый операнд тоже TRUE. if (101..200) { print 'hi;)';}

- напечатает вторую сотню строк



П2.3.4.14 Условный оператор



П2.3.4.14 Условный оператор

?: также как и в C является условным оператором. Он работает подобно if-then-else. Если аргумент перед ? - TRUE, то возвращается аргумент перед :, в противоположном случае возвращается аргумент после :. Скалярный или списковый контекст второго и третьего аргументов передается по наследству. ($a_or_b ? $a : $b) = $c;



П2.3.4.15 Операторы присваивания



П2.3.4.15 Операторы присваивания

= - обычный оператор присваивания. Вообще операторы присваивания работают также как и в C. $a += 2; - то же самое, что и $a = $a + 2; Можно использовать следующие сокращения: **= += *= &= <<= &&= -= /= |= >>= = .= %= ^= x=

($a += 2) *= 3; - то же самое, что и : $a = $a + 2; $a = $a * 3;



П2.3.4.16 Оператор ``запятая''



П2.3.4.16 Оператор ``запятая''

, - оператор запятая или comma-оператор. В скалярном контексте он обрабатывает левый аргумент и отбрасывает его значение, потом обрабатывает правый аргумент и возвращает его величину. В этом он подобен comma-оператору из C. В списковом контексте он играет роль разделителя аргументов и вставляет оба аргумента в список. => является синонимом comma-оператора.



П2.3.4.17 Логическое НЕ



П2.3.4.17 Логическое НЕ

Унарное NOT возвращает отрицание аргумента. Оно эквивалентно !, за исключением более низкого приоритета.



П2.3.4.18 Логическое И, ИЛИ и Исключающее ИЛИ



П2.3.4.18 Логическое И, ИЛИ и Исключающее ИЛИ

and возвращает конъюнкцию двух выражений. Он эквивалентен &&, за исключением более низкого приоритета. or возвращает дизъюнкцию аргументов. Он эквивалентен , за исключением более низкого приоритета. xor (eXclusive OR) - исключающее ИЛИ, возвращает истину, если истинен ровно один из аргументов.



П2.3.4.19 Оператор чтения из файла



П2.3.4.19 Оператор чтения из файла

В Perl есть несколько операций ввода-вывода. Для вывода из файла используется команда <>. open(STDIN,"/etc/passwd"); while ($string = <STDIN>) { @a = split(/[:]/,$string); }

Внутри этих скобок стоит дескриптор файла. Считывание происходит построчно. В конце файла <STDIN> принимает значение FALSE и цикл while завершается. По умолчанию считывание происходит в переменную $_. Нулевой дескриптор файла используется также как в sed и awk, то есть считывается поток из файлов перечисленных в командной строке.



П2.3.4.20 Оператор замены строки



П2.3.4.20 Оператор замены строки

Оператор s/PATTERN/REPLACEMENT/egimosx производит поиск строки, соответствующей шаблону PATTERN и если строка найдена, то подстановку на ее место текста REPLACEMENT. Возвращает количество произведенных подстановок. Если перед этим не использовался оператор =~ или !~ для определения переменной, которая будет обрабатываться, то будет модифицироваться переменная $_. Этот оператор используется со следующими опциями:

e интерпретирует правую часть как выражение.

g производит подстановку на место каждой строки, соответствующей шаблону.

i производит поиск различающий большие и маленькие буквы.

m обрабатывает строку, как состоящую из нескольких строк.

o происходит подстановка только на место первой встреченной строки.

s обрабатывает строку, как состоящую только из одной строки.

x использует расширенные регулярные выражения.

Например: $path =~ s|/usr/local/bin|/usr/bin|; ($foo = $bar) =~ s/this/that/o; $count = ($paragraf =~ s/Mister\b/Mr./gm);



П2.3.4.21 Оператор замены множества символов



П2.3.4.21 Оператор замены множества символов

tr/SEARCHLIST/REPLACEMENTLIST/cds y/SEARCHLIST/REPLACEMENTLIST/cds Заменяет все найденные символы из множества символов SEARCHLIST на соответствующие символы из множества символов REPLACEMENTLIST. Возвращает число символов, которые были заменены или удалены. Если посредством операторов =~, !~ не была указана никакая строка, то обрабатывается переменная $_. y является синонимом tr. Если SEARCHLIST заключен в скобки, то REPLACEMENTLIST тоже заключается в скобки, которые могут отличаться от тех, в которые заключается шаблон, например: tr[A-Z][a-z] tr(+-*/)/ABCD/

Этот оператор употребляется со следующими опциями:

c заменяет символы, которые не входят во множество SEARCHLIST на REPLACEMENTLIST, например: tr/a-zA-Z/ /cs;

заменит неалфавитные символы.

d Стирает символы, которые ни на что не заменяются.

s Переводит последовательность символов, которые заменяются на один и тот же символ в один символ.

Например: $a = 'CCCCCCCCC'; $a =~ tr/C/D/s;

теперь $a = 'D'



П2.4.1.1 Основные понятия



П2.4.1.1 Основные понятия

В предыдущих версиях Perl была реализована возможность только символьных ссылок. Perl версии 5 и выше позволяет использовать не только символьные ссылки на переменные, но и ``жесткие'' ссылки на любые данные. Так как любой скаляр может быть ссылкой, а массивы и хэши состоят из скаляров, то можно с легкостью организовать массив массивов, массив хэшей, хэш массивов и так далее. ``Жесткие'' ссылки следят за счетчиком ссылки и как только счетчик становится равным нулю, автоматически удаляют ссылку. Символьные ссылки содержат только имя переменной, также как символьная ссылка файловой системы содержит просто имя файла. Ссылки могут быть созданы несколькими способами:

Используя бэкслэш оператор перед переменной, подпрограммой или простой константой. (Это работает почти как & - создается еще одна ссылка, так как одна уже существует в символьной таблице.) $varref = \$foo; $arref = @ARGV; $hashref = \%ENV; $coderef = \&handler;

Ссылка на массив может быть создана с использованием квадратных скобок: $arrayref = [1,2,['a','b','c']];

По адресу $arrayref[2][1] будет храниться значение b. Ссылка на произвольный хэш может быть создана с использованием фигурных скобок: $hashref = { 'Earth' => 'Moon', 'Jupiter' => 'Kallisto', ... };

Ссылка на подпрограмму может быть создана с использованием слова sub, без определения имени подпрограммы: $coderef = sub { print "Hello!\n" };

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

Чтобы извлечь информацию, на которую указывает ссылка, тоже существует несколько методов:

Можно сделать идентификатор ссылки частью имени переменной или подпрограммы: $bar = $$scalarref; push(@$arrayref,$filename); $$arrayref[0] = "January"; $$hashref{"key"} = "value"; &$coderef(1,2,3); $refrefref = \\\"how are you?"; print $$$$refrefref;


- напечатает ``how are you?''.

Нужно понимать, что раскрытие ссылки имеет более высокий приоритет, чем извлечение значения переменной. Можно поступить как и в предыдущем случае, но заключить выражение после знака $в фигурные скобки. Приведенный пример тогда будет выглядеть таким образом: $bar = ${$scalarref}; push(@{$arrayref},$filename); ${$arrayref}[0] = "January"; ${$hashref}{"key"} = "value"; &{$coderef}(1,2,3);

В данном случае использование фигурных скобок ничего не меняет, но в общем случае в скобках может стоять произвольное выражение, даже подпрограмма: &{ $dispatch{$index} }(1,2,3);

В случае массива или хэша можно использовать такую запись: $arrayref->[0] = "January"; $hashref->{"key"} = "value";

Левая часть должна быть выражением, возвращающим ссылку, возможно также являющуимся раскрытием ссылки: $array[$x]->{"foo"}->[0] = "January";

Если ссылка является ссылкой на объект, то раскрытие данных происходит также, как уже было описано выше.

Функция ref() может быть использована для определения типа объекта, на который указывает ссылка. Функция bless() может быть использована для ассоциирования ссылки с пакетом, функционирующим как объектный класс.


П2.4.1.2 Символьные ссылки



П2.4.1.2 Символьные ссылки

Мы рассмотрели, что происходит, если величина, используемая в качестве ссылки, не была определена ранее. Что же происходит, если она уже определена и не является жесткой ссылкой? В таком случае она обрабатывается как символьная ссылка. То есть значение скаляра рассматривается как имя переменной, а не прямая ссылка на переменную. ¯ $name = "foo";

$$name = 1; - то же самое, что $foo = 1;

${$name} = 2; - то же самое, что $foo = 2;

${$name x 2 } = 3; -то же самое, что $foofoo = 3;

$name->[0] = 4; -то же самое, что $foo[0] = 4;

@$name = (); - обнуляет массив @foo

&$name(); - вызывает &foo



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



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

Perl позволяет использовать регулярные выражения. Для того чтобы пояснить, что же представляет из себя регулярное выражение приведем несколько примеров:

/SWAP.*/ - соответствуют все слова начинающиеся со SWAP и заканчивающихся произвольным набором символов. Точка обозначает произвольный символ, звездочка - то, что символ, стоящий перед ней, входит в слово 0 и более раз. Все метасимволы, которые будут описаны ниже, бозначают вхождение того, что стоит перед ними.

/\w*/ - соответствуют слова состоящие только из алфавитных, цифровых символов и символа подчерк. \w - соответствует алфавитным, цифровым символам и символу подчерк, звездочка - тому, что эти символы могут входить произволное количество раз. Здесь мы приведем только основные метасимволы. Для более подробной информации смотрите соответствующие страницы man по Perl. ¯ * соответствует 0 или более вхождений + соответствует 1 или более вхождений ? соответствует 1 или 0 вхождений {n} соответствует ровно n вхождений {n,} соответствует по крайней мере n вхождений {n,m} соответствует по крайней мере n, но не более m вхождений

Метасимвол * эквивалентен {0,}, + эквивалентен {1,} и ? эквивалентен {0,1}. Ограничений на величину m и n нет. Эта стандартная конструкция работает в ``жадном'' режиме, то есть: регулярному выражению a.*b будет соответствовать всевозможный набор слов начинающихся с символа a и кончающихся символом b, в том числе слова типа abcab. В таких словах есть подпоследовательности символов, которые также удовлетворяют условиям регулярного выражения. Если после каждого из описанных метасимволов поставить знак ?, то подобные последовательности будут опускаться. Шаблоны обрабатываются как строка в двойных кавычках, поэтому приведенные ниже последовательности также будут обрабатываться: ¯ \l - передвижение на символ вниз \u - передвижение на символ вверх

А также все перечисленные ранее бакслэш-последовательности. В Perl-е определены также: ¯ \w - соответствуют алфавитные и цифровые символы а также символ подчерк \$W - соответствуют все символы не входящие во множество символов w \s - символы пробела, табуляции, возврата каретки \S - все символы не входящие во множество символов s \d - цифровые символы \D - нецифровые символы


Обратите внимание, что \ w отмечает только отдельные символы, а не все слово. Чтобы отметить все слово нужно использовать \w+. Также определены следующие команды: ¯ \b - соответствуют границы слова \B - соответствуют не-границы слова \A - соответствуют только начало строки \Z - соответствуют только конец строки

При использовании конструкции типа ( ... ), \<digit> подставляет подстроку из скобок с номером digit. Можно использовать скобки для отделения подшаблона. Если в скобках имеется более, чем 9 подстрок, то переменные $10, $11, ... содержат соответствующие подстроки. $+ возвращает то, чему соответствует последняя конструкция в скобках. $& возвращает подставленную строку. $` возвращает все перед подставленной строкой, $' возвращает все после подставленной строки. $_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; - напечатает abc:def:ghi

На этом мы закончим описание регулярных выражений, для более подробной информации читайте manual page.


П2.4.3 Зарезервированные переменные



П2.4.3 Зарезервированные переменные

В Perl есть имена имеющие специальное значение. Многие из них аналогичны зарезервированным именам в shell.

Если вы хотите использовать длинные имена переменных, в заголовке программы требуется сказать:

use English;

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



П2.4.5.1 Подпрограммы



П2.4.5.1 Подпрограммы

Описать и использовать подпрограмму можно несколькими способами:

sub NAME; - подразумевает описание в дальнейшем тела подпрограммы. sub NAME BLOCK - непосредственное описание. $subref = sub BLOCK - анонимное описание. use PACKAGE qw(NAME1, NAME2, NAME3) - включение подпрограмм из модулей.

Вызвать подпрограмму можно тоже несколькими способами:

&NAME(LIST) - скобки обязательны для & формы. NAME(LIST) - & не обязательно со скобками. NAME LIST - скобки можно опустить в случае предварительного описания или включения подпрограммы из модуля.

Аргументы передаются подпрограмме в виде локального массива @_, его элементы являются ссылками на реальные скалярные параметры. Подпрограмма возвращает значение, полученное в результате исполнения последнего оператора подпрограммы. Как уже говорилось, подпрограмма вызывается использованием префикса & перед ее именем, в Perl 5 этот префикс не обязателен. Пример: sub MAX { my $max = pop(@_); foreach $foo (@_) { $max = $foo if $max < $foo; } $max; } ... $bestmark = &MAX(1,2,3,4,5);

Подпрограмма может вызываться рекурсивно. Если подпрограмма вызывается с использованием & формы, то список аргументов необязателен. Если вы хотите создать внутри модуля его собственную, невидимую снаружи подпрограмму, то описание должно быть анонимным: my $subref = sub {...} &$subref(1,2,3);