|
Поиск по сайту:
Главная
О проекте
Web-мастеру
HTML & JavaScript
SSI
Perl
PHP
XML & XSLT
Unix Shell
MySQL
Безопасность
Хостинг
Другое
|
|
3.4 Операторы языка Perl
3.4.1 Термы и операторы списка
Операторы в Perl-е имеют различный приоритет. Операторы, заимствованные из C ,
сохранили между собой ту же иерархию, что и в C . Термы имеют самый большой
приоритет, они содержат переменные, кавычки, выражения в скобках,
функции с их
параметрами. Если за списковым оператором ( например, print()) или унарным
оператором ( например, chdir()) следует список аргументов, заключенный в
скобки, то эта последовательность имеет самый высокий приоритет, подобно
функции с аргументами. Аналогично термам обрабатываются последовательности
do{} и eval{} .
3.4.2 Оператор ``стрелка''
Также, как в С и С++ ``-> '' является инфиксным оператором ссылки. Если правая
часть является [...] или {...} подпрограммой, тогда левая часть должна быть
символьной ссылкой на массив или хэш. Если правая часть - это имя метода или
скалярная переменная содержащая имя метода, то левая часть должна быть объектом
или именем класса.
П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
3.4.4 Экспоненциальный оператор
В Perl-е двойная звездочка ** является экспоненциальным оператором. Он
требует к себе даже больше внимания, чем унарный минус: -2**4 это -(2**4) , но
не (-2)**4 .
3.4.5 Символьные унарные операторы
Унарный ! означает логическое отрицание. Унарный минус, в случае числового
значения переменной, обозначает обычное арифметическое отрицание. Если операндом
является идентификатор, то возвращается строка, состоящая из знака минус и
идентификатора. Если строка начинается со знака + или - , то возвращается
строка, начинающаяся с противоположного знака.
Унарная тильда ``~ '' обозначает побитовое отрицание.
Унарный плюс не имеет влияния даже на строки. Он используется для отделения
имя функции от выражения заключенного в скобки, которое иначе рассматривается
как список аргументов.
rand (10) * 20; - (rand10) * 20;
rand +(10) * 20; - rand(10 * 20);
Унарный бэкслэш ``'' обозначает ссылку на то, что стоит за ним.
3.4.6 Операторы связки
Знак равенства с тильдой ``=~ ''связывает выражение слева
с определенным шаблоном. Некоторые операторы обрабатывают и модифицируют
переменную $_ . Эти же операции иногда желательно бывает выполнить над
другой переменной. Правый аргумент это образец поиска, подстановки или
трансляции, левый аргумент - это то, что должно быть подставлено вместо
$_ . Возвращаемая величина показывает успех операции.
Бинарное ``!~ '' это тоже самое, что и ``=~ '', только
возвращаемая величина является отрицательной в логическом смысле.
3.4.7 Бинарные операторы
Звездочка * - умножение двух чисел. Cлэш / - деление числа на число.
Процент % - вычисляет модуль двух чисел, x - оператор повторения. В
скалярном контексте возвращает строку, состоящую из многократно повторенного
левого операнда, причем повторяется он то количество раз, которое стоит справа.
В списковом контексте он многократно повторяет список.
print 'a' x 80; напечатает букву a 80 раз.
@ones = (1) x 80; массив из восьмидесяти единиц.
@ones = (5) x @ones сделает все элементы равными пяти.
Бинарный плюс - операция сложения двух чисел.
Бинарный минус - операция вычитания двух чисел.
Бинарная точка - конкатенация строк.
3.4.8 Операторы сдвига
Двоичный сдвиг осуществляется, как и во многих других языках
программирования, с помощью операторов ``<<'' и ``>>''. При применении
этих операторов значения левых аргументов сдвигаются в соответствующую
сторону на количество разрядов, указанное в правых аргументах.
Аргументы должны быть целочисленными.
3.4.9 Операторы сравнения
``<'' - возвращает TRUE если левый аргумент численно меньше, чем правый.
``>'' - возвращает TRUE если правый аргумент численно меньше, чем левый.
``<='' - возвращает TRUE если правый аргумент численно меньше или равен левому.
``>='' - возвращает TRUE если левый аргумент численно меньше или равен правому.
``gt'' - возвращает TRUE если левый аргумент меньше (в строковом контексте), чем правый.
``lt'' - возвращает TRUE если правый аргумент меньше (в строковом контексте), чем левый.
На поведение операторов lt и gt влияют установки
системного языка, если операционная система способна работать с несколькими
языками. По этой причине операторы должны корректно работать со строками
на языках, отличных от US ASCII , что в системе UNIX задается указанием
свойств LC_COLLATE системного locale .
3.4.10 Операторы эквивалентности
== возвращает TRUE , если левый аргумент численно эквивалентен правому.
!= возвращает TRUE , если левый аргумент численно неэквивалентен правому.
<=> возвращает -1, 0 или 1 в зависимости от того, численно меньше,
равен или больше левый аргумент правого.
eq возвращает TRUE , если левый аргумент эквивалентен правому (в строковом контексте).
ne возвращает TRUE , если левый аргумент неэквивалентен правому (в строковом контексте).
cmp возвращает -1, 0 или 1 в зависимости от того, меньше равен или
больше левый аргумент правого (в строковом контексте).
3.4.11 Побитовое И, побитовое ИЛИ и Исключающее ИЛИ
Бинарное & возвращает объединенные побитово операнды.
Бинарное | возвращает перемноженные побитово операнды.
Бинарное ^ возвращает исключенные побитово операнды.
3.4.12 Логическое И и логическое ИЛИ
Бинарное && - логическое И. Если левый аргумент FALSE , то правый не проверяется.
Бинарное || - логическое ИЛИ. Если левый аргумент TRUE , то правый
аргумент не проверяется.
||''и && отличаются от подобных операторов в \verb C| тем, что вместо 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);
3.4.13 Оператор диапазона
.. - оператор диапазона. Реально это два разных оператора, в зависимости
от контекста. В списковом контексте он работает как оператор диапазона от
левого аргумента до правого.
for (1..10) {
#code
}
В скалярном контексте он возвращает булевское
значение. Если левый операнд TRUE , то .. принимает значение TRUE , если
правый операнд тоже TRUE .
if (101..200) { print 'hi;)';}
- напечатает вторую сотню строк
3.4.14 Условный оператор
?: также как и в C является условным оператором. Он работает подобно
if-then-else . Если аргумент перед ? - TRUE , то возвращается аргумент
перед : ,
в противоположном случае возвращается аргумент после : .
Скалярный или списковый контекст второго и третьего аргументов передается
по наследству.
($a_or_b ? $a : $b) = $c;
3.4.15 Операторы присваивания
= - обычный оператор присваивания. Вообще операторы присваивания работают
также как и в C .
$a += 2; - то же самое, что и $a = $a + 2;
Можно использовать следующие сокращения:
**= += *= &= <<= &&=
-= /= |= >>= ||=
.= %= ^= x=
($a += 2) *= 3; - то же самое, что и :
$a = $a + 2;
$a = $a * 3;
3.4.16 Оператор ``запятая''
, - оператор запятая или comma-оператор. В скалярном контексте он
обрабатывает левый аргумент и отбрасывает его значение, потом обрабатывает
правый аргумент и возвращает его величину. В этом он подобен comma-оператору
из C . В списковом контексте он играет роль разделителя аргументов и вставляет
оба аргумента в список. => является синонимом comma-оператора.
3.4.17 Логическое НЕ
Унарное NOT возвращает отрицание аргумента. Оно эквивалентно ! , за
исключением более низкого приоритета.
П2.3.4.18 Логическое И, ИЛИ и Исключающее ИЛИ
and возвращает конъюнкцию двух выражений. Он эквивалентен && , за
исключением более низкого приоритета.
or возвращает дизъюнкцию аргументов. Он эквивалентен ||, за исключением
более низкого приоритета.
xor (eXclusive OR) - исключающее ИЛИ, возвращает истину, если истинен
ровно один из аргументов.
3.4.19 Оператор чтения из файла
В Perl есть несколько операций ввода-вывода. Для вывода из файла используется
команда <>.
open(STDIN,"/etc/passwd");
while ($string = <STDIN>)
{
@a = split(/[:]/,$string);
}
Внутри этих скобок стоит дескриптор файла. Считывание происходит построчно.
В конце файла <STDIN> принимает значение FALSE и цикл while завершается.
По умолчанию считывание происходит в переменную $_ . Нулевой дескриптор файла
используется также как в sed и awk , то есть считывается поток из файлов перечисленных
в командной строке.
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);
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'
[Назад]
[Содержание]
[Вперед]
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|
|
|