Введение в Perl
Шрифт:
ассоц. операторы
– –
левая термы и левосторонные списковые операторы
левая ->
– ++ –
правая **
правая ! ~ \ унарные + и -
левая =~ !~
левая * / % x
левая + – .
левая << >>
– именованные унарные операторы
– < > <= >= lt gt le ge
– == != <=> eq ne cmp
левая &
левая | ^
левая &&
левая ||
– ..
правая ?:
правая = += -= *= и т.д.
левая , =>
– правосторонние списковые операторы
левая not
левая and
левая or xor
Любой терм имеет самый высокий приоритет. К терму относятся переменные, кавычки и их операторы, арифметические и логические выражения в скобках, любые функции с параметрами в скобках. Фактически таких функций нет так как это просто унарные и списковые операторы просто они ведут себя подобно функциям с параметрами в скобках. Подробно смотри главу «Функции».
Если после любого спикового оператора ( print, и т.д.) или унарного оператора (chdir, и т.д.) следует левая круглая скобка, то операторы внутри скобок имеют наивысший приоритет. Так же как и обычные функции.
Если скобки отсутсвуют то приоритет списковых операторов или наивысший или наименьший в отношении операторов справа или слева от него.
Например:
@i = ('a ','b ', print 'c ', 'd ');
print «\n»,@i,"\n";
Результат:
c d
a b 1
Здесь мы имеем списковый оператор print. Для запятых слева от него он имеет наименьший приоритет, но повышает приоритет правой запятой.
Поэтому правая запятая воспринимается как параметр для print и печатается 'c d' а левая просто записывает код завершения операции в массив @i и последний print показывает это.
Так же как в С или С++ это инфиксный оператор переадрессации. Если справа от него стоит [...] или {...} выражение, то правая часть может быть непосредственной или символической ссылкой на массив или хеш.
В противном случае правая сторона это метод или простой скаляр содержащий имя метода, а правая или объект или имя класса. Подробно смотри главу «Классы».
Эти операторы работают так же как и в С. Если оператор стоит перед переменной то значение переменной изменяется на 1 и полученной значение используется. Если после переменной то ее величина изменяется после применения.
Употребление инкремента к строковым переменным в Перл имеет одну особенность.
Каждый символ остается в своем классе (большие, малые, цифры) и учитывается перенос предыдущего символа. Таким образом строковые переменные с цифрами работают как числовые переменные.
Пример:
print ++($i = «09»); # Результат «10»
print ++($i = «a9»); # «b0»
print ++($i = «az»); # «ba»
print ++($i = «aZ»); # «bA»
Пример:
print 4**2 # Результат 16
print -4**2 # Результат -16 т.е.
– (4**2)
'!' – логическое отрицание
'– ' – арифметический минус
'~' – побитная инверсия (дополнение до 1)
'+' – арифметический плюс
'\' – получение ссылки на переменную (как & в С)
Эти «необычные» я бы даже сказал оригинальные операторы имеют очень широкое применение в Перл. Можно даже назвать их «оригинальным» решением.
Оператор =~ логически связывает левую часть выражения с патерном (pattern – образец, шаблон, модель) в правой. По умолчанию поиск или изменение по патерну выполняется в переменной $_ Операторы привязки позволяют делать это с любой переменной указанной в левой части. Логическим результатом будет успех операции. Если в правой части вместо патерна присутсвует выражение, то результат этого выражения воспринимается как патерн. Однако это не очень эффективно т.к. патерн будет компилироваться во время исполнения программы что заметно снизит быстродействие.
Оператор !~ аналогичен =~ только результат совпадения инвентируется (логическое «нет»). Подробное применение этих операторов приводится в главе «Патерны».
'*' – арифметическое умножение
'/' – арифметическое деление
'%' – арифметический модуль
'x' – оператор повторения
В скалярном контексте возвращает строку левой части повторенную величиной указанной в правой части. В списковом контексте, если в левой части список в круглых скобках – повторенный список.
Пример:
print '*' x 5; # Результат '*****'
print (1,2) x 3; # Результат 121212
'+' – арифметический плюс
'– ' – арифметический минус
'.' – конкатенация (объединение) строк
'<<' – Сдвигает побитно влево значение выражения в левой части на количество бит указанное в правой.