Perl — operators
Содержание:
Perl Logical Operators
There are following logical operators supported by Perl language. Assume variable $a holds true and variable $b holds false then −
| Sr.No. | Operator & Description |
|---|---|
| 1 |
and Called Logical AND operator. If both the operands are true then then condition becomes true. Example − ($a and $b) is false. |
| 2 |
&& C-style Logical AND operator copies a bit to the result if it exists in both operands. Example − ($a && $b) is false. |
| 3 |
or Called Logical OR Operator. If any of the two operands are non zero then then condition becomes true. Example − ($a or $b) is true. |
| 4 |
|| C-style Logical OR operator copies a bit if it exists in eather operand. Example − ($a || $b) is true. |
| 5 |
not Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true then Logical NOT operator will make false. Example − not($a and $b) is true. |
Альтернативы Perl
Существует несколько альтернатив использованию Perl:
- С, Visual Basic — более традиционные компьютерные языки для обработки вводимых данных. Должны компилироваться под определенную платформу.
- ActiveX — включение программных компонент, выполняющихся в браузере.
- JavaScript, VBScript — обеспечивают некоторую интерактивность HTML страниц, которую HTML обеспечить не может.
- Cold Fusion — сторонняя программа для связи форм с базами данных.
- PHP/FI — еще одна сторонняя программа для связи форм с базами данных.
Несмотря на это Perl на сегодняшний день является наиболее простым и быстрым и в тоже время очень мощным средством придания интерактивности вашему узлу.
Define a Pagination
What about if your report is taking more than one page? You have a solution for that, simply use $% or $FORMAT_PAGE_NUMBER vairable along with header as follows −
format EMPLOYEE_TOP =
===================================
Name Age Page @<
$%
===================================
.
Now your output will look like as follows −
=================================== Name Age Page 1 =================================== =================================== Ali 20 2000.00 =================================== =================================== Raza 30 2500.00 =================================== =================================== Jaffer 40 4000.00 ===================================
Translation Operator Modifiers
Following is the list of operators related to translation.
| Sr.No. | Modifier & Description |
|---|---|
| 1 |
c Complements SEARCHLIST. |
| 2 |
d Deletes found but unreplaced characters. |
| 3 |
s Squashes duplicate replaced characters. |
The /d modifier deletes the characters matching SEARCHLIST that do not have a corresponding entry in REPLACEMENTLIST. For example −
#!/usr/bin/perl $string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d; print "$string\n";
When above program is executed, it produces the following result −
b b b.
The last modifier, /s, removes the duplicate sequences of characters that were replaced, so −
#!/usr/bin/perl $string = 'food'; $string = 'food'; $string =~ tr/a-z/a-z/s; print "$string\n";
When above program is executed, it produces the following result −
fod
truncate
truncate ДЕСКРИПТОР, ДЛИНА; truncate ИМЯ_ФАЙЛА, ДЛИНА;
Функция truncate() усекает файл до заданной длины. Для задания файла можно использовать как имя файла, так и дескриптор открытого файла.
Функция возвращает значение Истина, если длина файла успешно усечена до количества байт, определенных в параметре ДЛИНА, или неопределенное значение undef в противном случае.
Под усечением файла понимается не только уменьшение его длины, но и увеличение. Это означает, что значение второго параметра функции truncate() может быть больше истинной длины файла, что позволяет делать «дыры» в содержимом файла, которые в дальнейшем можно использовать для записи необходимой информации, не уничтожая уже записанную в файл.
Пример (Файл с «дырами»):
#! perl -w
# Создание файла с "дырами"
for ($i=1;$i<=3;$i++) {
open (F, ">>>out.dat") or die $!;
print F "Запись".$i;
close F;
open (F, ">>out.dat") or die $!;
truncate F, 19*$i;
close F;
}
# Запись информации в "дыры"
open (F, "+<out.dat") or die $!;
for ($i=1;$i<=3;$i++) {
seek F,0,1;
read F,$recl,7;
seek F,0,1;
print F "<CONTENTS:".$i.">"
}
close F;
На каждом шаге первого цикла for в конец файла out.dat записывается информация длиной 7 байтов, а потом его длина увеличивается на 12 байтов, образуя пустое пространство в файле. Следующий цикл for заносит в эти созданные «дыры» информацию длиной 12 байтов, не затирая хранящуюся в файле информацию.
Для изменения длины файла функцией truncate приходится закрывать его и снова открывать. Это связано с тем обстоятельством, что функция truncate() добавляет пустое пространство в начало файла, сдвигая в конец его содержимое, если применять ее, не закрывая файл.
После выполнения первого цикла for содержимое файла out.dat выглядит так:
Запись1 Запись2 Запись3
По завершении всей программы файл будет содержать следуюшую строку:
Запись1<CONTENTS:1>Запись2<CONTENTS:2>Запись3<CONTENTS:3>
Perl Bitwise Operators
Bitwise operator works on bits and perform bit by bit operation. Assume if $a = 60; and $b = 13; Now in binary format they will be as follows −
$a = 0011 1100
$b = 0000 1101
——————
$a&$b = 0000 1100
$a|$b = 0011 1101
$a^$b = 0011 0001
~$a = 1100 0011
There are following Bitwise operators supported by Perl language, assume if $a = 60; and $b = 13
| Sr.No. | Operator & Description |
|---|---|
| 1 |
& Binary AND Operator copies a bit to the result if it exists in both operands. Example − ($a & $b) will give 12 which is 0000 1100 |
| 2 |
| Binary OR Operator copies a bit if it exists in eather operand. Example − ($a | $b) will give 61 which is 0011 1101 |
| 3 |
^ Binary XOR Operator copies the bit if it is set in one operand but not both. Example − ($a ^ $b) will give 49 which is 0011 0001 |
| 4 |
~ Binary Ones Complement Operator is unary and has the efect of ‘flipping’ bits. Example − (~$a ) will give -61 which is 1100 0011 in 2’s complement form due to a signed binary number. |
| 5 |
<< Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand. Example − $a << 2 will give 240 which is 1111 0000 |
| 6 |
>> Binary Right Shift Operator. The left operands value is moved right by the number of bits specified by the right operand. Example − $a >> 2 will give 15 which is 0000 1111 |
[править] Примечания
- Чему в немалой степени поспособствовали разошедшиеся по Сети и даже печати всякие «пособия по CGI-программированию», написанные быдлокодерами, кроме своей хоумпаги ничего не писавшими.
|
Perl — на ЛОРе это не нужно |
||||||||
|---|---|---|---|---|---|---|---|---|
|
|
Любой программист без словаря поймёт, что такое Perl |
||||||||
|---|---|---|---|---|---|---|---|---|
|
Бесскобочные функции
На наш взгляд, это самый подходящий перевод термина parenthesis-less.
Например, print часто пишется и вызывается без скобок. Возникает вопрос, а можем ли мы тоже создавать такие функции?
Безусловно. Для этого у Perl есть даже специальная прагма — subs. Предположим, что мы хотим напечатать OK, если определенная переменная true. В Perl (как и в C) нет такого типа данных, как Boolean, вместо него выступает неложное значение, например, 1.
Данная программа напечатает OK. Но это не единственный способ. Perl хорошо продуман, поэтому, если мы реструктуризируем нашу программу и приведём её к такому виду:
… то результат будет тот же. Закономерность здесь следующая: мы можем вызывать функцию без скобок в нескольких случаях:
— используя прагму subs;
— написав функцию ПЕРЕД её вызовом;
— использовать прототипы функций.
Обратимся к последнему варианту.
Define a Format
Following is the syntax to define a Perl format −
format FormatName = fieldline value_one, value_two, value_three fieldline value_one, value_two .
Here FormatName represents the name of the format. The fieldline is the specific way, the data should be formatted. The values lines represent the values that will be entered into the field line. You end the format with a single period.
Next fieldline can contain any text or fieldholders. The fieldholders hold space for data that will be placed there at a later date. A fieldholder has the format −
@<<<<
This fieldholder is left-justified, with a field space of 5. You must count the @ sign and the < signs to know the number of spaces in the field. Other field holders include −
@>>>> right-justified @|||| centered @####.## numeric field holder @* multiline field holder
An example format would be −
format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name $age @#####.## $salary =================================== .
In this example, $name would be written as left justify within 22 character spaces and after that age will be written in two spaces.
Основные части Perl скрипта
В общем случае любой Perl скрипт состоит из четырех ключевых частей:
- Настойка. Первая часть скрипта обязательно запускает интерпретатор и устанавливает переменный, используемые в теле скрипта. Для запуска интерпретатора необходимо знать правильный путь к программе.
- Чтение входных данных. Эта часть «считывает» и сохраняет в переменных входные данные в удобной для обработки форме. Эта часть обычно неизменна во всех скриптах.
- Обработка входных данных. Эта часть соответствующим образом обрабатывает введенные данные. Она может быть простой (около 5 строк) или очень сложной (более 1000 строк) в зависимости от выполняемой задачи.
- Вывод результатов. Пользователь обычно ожидает какого-либо ответа на свои действия. Эта часть достаточно проста в реализации.
Замыкания (Closures)
Как сказано в википедии
По сути, замыкание — это аналог класса в ООП: предоставляет функциональность и данные связанные и упакованные вместе. Рассмотрим пример замыкания в Perl и класса в C++:
C++
Проведем анализ приведенного кода:
-
объявление приватной переменной:
Perl:
С++:
-
инициализирование приватной переменной:
Perl:
C++:
-
создание подпрограммы, перемножающей переданное ей значение с ранее инициализированной переменной:
Perl:
C++:
Для использования замыкания в Perl и класса в C++, их нужно определить, т.е. создать объект:
Определение объекта:
Использование:
Определение объекта:
Использование:
В C++ объект класса, в котором определен оператор определения , зачастую называют функциональным объектом, или функтором. Функциональные объекты чаще всего используются как аргументы для общих алгоритмов. Например, для того, чтобы сложить элементы вектора, можно использовать алгоритм for_each, который применяет переданную функцию к каждому элементу последовательности и класс Sum с перегруженным оперетором , который складывает все элементы последовательности и возвращает сумму. Также, вместо класса Sum можно использовать лямбды, которые появились в C++11.
Как видно из примера, в C++ мы объявляем класс , который содержит:
- приватную переменной , которая инициализируется в стандартном конструкторе;
- перегруженный оператор , который получает каждое значение посделовательности и суммирует в перемменую ;
- метод для доступа к приватной переменной .
В примере на Perl мы создаем функцию , которая принимает ссылку на массив и анонимную функцию. Далее мы проходим по массиву, и выполняем анонимную функцию (замыкание), передавая ей в качестве параметра очередной элемент массива.
При использовании функции , мы сначала определяем лескическую переменную , инициализированную нулем. Затем в функцию передаем ссылку на массив и функцию-замыкание, в которой мы суммируем каждый элемент массива в переменную . После выполения функции в переменной будет содержаться сумма массива.
Аналогом функции-замыкания из примера на Perl, в C++ является использование лямбд, как показано в коде. В примере на Perl функция-замыкание, передаваемая в функцию, также называется колбеком, или функцией обратного вызова.
print ДЕСКРИПТОР СПИСОК;
Здесь ДЕСКРИПТОР представляет дескриптор файла, в который функция выводит строковые данные, представленные списком вывода СПИСОК. Он может состоять из переменных, элементов массивов и выражений, вычисляемых как строковые данные. Дескриптор файла создается функцией open(). Он может быть опущен, и в этом случае вывод осуществляется в стандартный файл вывода STDOUT, если только функцией select() не выбран другой файл вывода по умолчанию. Обычное стандартное устройство вывода — экран монитора компьютера.
Функция print при выводе своего списка не завервает его символом новой строки «n». Это означает, что следующая функция print начнет вывод на экран непосредственно после последнего выведенного предыдущей функцией print символа. Если такое поведение не желательно, то следует список вывода каждой функции print явно завершать строкой, содержащей символ новой строки, или включать его последним символом последнего элемента списка вывода.
Пример 1:
#! perl -w print "Строка 1:"; print "Строка 2:n"; print "Строка 3:","n"; print STDOUT "Строка 4:n";
Вот что получится на экране :
Строка 1:Строка 2: Строка 3: Строка 4:
Вторая функция print начинает свой вывод на той же строке, на которой завершила вывод первая функция, в которой в списке вывода нет символа перехода на новую строку. В четвертой функции явно указан дескриптор стандартного файла вывода STDOUT.
Функция print, как и большинство других функций, является списковой операцией, и все элементы списка вывода вычисляются в списковом контексте. Это обстоятельство следует учитывать при использовании в качестве элементов списка вывода выражений с вызовами подпрограмм.
Если параметры функции print, включая дескриптор файла, заключены в круглые скобки, то такая синтаксическая конструкция считается термом и в выражении имеет наивычший приоритет вычисления.
Пример 2:
print ($m + $n) **2;
Будет напечатана сумма значений переменных $m и $n, а не их сумму, возведенную в квадрат. Компилятор Perl, обнаружив после лексемы print левую круглую скобку, найдет правую круглую скобку и будет рассматривать их содержимое как список параметров функции print. А так как такая констркция есть терм, то сначало будет выполнена операция печати суммы значений переменных, а потом результат этой операции (Истина = 1) будет возведен в квадрат. Добавление необязательного дескриптора стандартного файла вывода STDOUT исправит подобную ошибку :
Пример 3:
print STDOUT ($m + $n) ** 2; # Выведет ($m + $n) ** 2
Если в функции печати print не задан список вывода, то она по умолчанию выводит содержимое специальной переменной $_ в файл, определенный параметром ДЕСКРИПТОР.
Пример 4:
print; # Выводится содержимое переменной $_ на экран монитора print STDOUT; # Эквивалентен предыдущему оператору print FILEOUT; # Выводится содержимое переменной $_ в файл # с дескриптором FILEOUT
Whitespaces in Perl
A Perl program does not care about whitespaces. Following program works perfectly fine −
#!/usr/bin/perl print "Hello, world\n";
But if spaces are inside the quoted strings, then they would be printed as is. For example −
#!/usr/bin/perl
# This would print with a line break in the middle
print "Hello
world\n";
This will produce the following result −
Hello
world
All types of whitespace like spaces, tabs, newlines, etc. are equivalent for the interpreter when they are used outside of the quotes. A line containing only whitespace, possibly with a comment, is known as a blank line, and Perl totally ignores it.
Атрибуты функций
В Python есть такое понятие как декоратор. Это такая штуковина, которая позволяет «добавить объекту дополнительное поведение».
Да, в Perl декораторов нет, зато есть атрибуты функций. Если мы откроем perldoc perlsub и посмотрим на описание функции, то увидим любопытную запись:
Таким образом, функция с атрибутами может выглядеть так:
Работа с атрибутами в Perl — дело нетривиальное, потому уже довольно давно в стандартную поставку Perl входит модуль Attribute::Handlers.
Допустим, у нас есть функция, которая может быть вызвана только в том случае, если пользователь авторизован. За то что пользователь авторизован отвечает переменная $auth, которая равна 1, если пользователь авторизован, и 0, если нет. Мы можем сделать следующим образом:
И это приемлемое решение.
Но может возникнуть такая ситуация, что функций будет становиться больше и больше. А в каждой делать проверку будет всё накладнее. Проблему можно решить на атрибутах.
В данном примере вызов программы будет выглядеть так:
А если мы заменим return 0 на return 1 в is_auth, то:
Не зря атрибуты представлены в конце статьи. Для того чтобы написать этот пример, мы воспользовались:
— анонимными функциями;
— оверрайдом функций;
— специальной формой оператора goto.
Несмотря на довольно громоздкий синтаксис, атрибуты успешно применяются в Catalyst. К тому же не стоит забывать, что они, всё-таки, являются экспериментальной фичей Perl, а потому их синтаксис может меняться.
Статья написана в соавторстве и по техническому материлу от Дмитрия Шаматрина АКА justnoxx и при содействии программистов : Тимура Нозадзе, Виктора Ефимова, Полины Шубиной, Andrew Nugged
Упростите свою жизнь
Следующее препятствие — отправка имени пользователя и пароля на защищённый сайт. В то время как Вы можете достичь эту цель, используя только LWP, на подсознательном уровне появляется желание написать сценарий, который взаимодействует со страницей таким же образом, как делаете это Вы с помощью обычного браузера, или хотя бы, по возможности, максимально к этому приближенным.
После того, как я написал несколько сценариев и отправил фрагменты из них на списки рассылки libwww@perl.org, рассчитывая получить помощь,
я получил ответ — «Эй, будет значительно проще, если ты будешь просто использовать WWW::Mechanize.» Итак, я снова обратился к CPAN, чтобы попробовать последовать этому совету.
Я быстро прочитал документацию — и загадка регистрации на защищённом веб-сайте была решена. Модуль WWW::Mechanize позволяет Вам взаимодействовать с веб-сайтом почти так же, как Вы бы взаимодействовали с веб-браузером. Это позволит Вам переходить по ссылкам и заполнять формы. Этот модуль как раз то, что нужно и мне, и Вам. Вот как его можно получить.
- Отложите в сторону Ваш код и откройте командную строку (это напомнит Вам о тех старых добрых временах, когда работали в DOS).
- Перейдите в папку C:\Perl\bin и напечатайте .
Диспетчер пакетов Perl запустится, и Вы окажетесь в командной строке . - В командной строке ppm напечатайте . Поиск выдаст пару подходящих значений. Вам нужно то, которое выглядит как (в моём поиске оно стояло первым).
- Для того, чтобы установить модуль, напечатайте
(если Ваш поиск отображает WWW::Mechanize на другой позиции, введите другое число вместо 1).
[править] История
|
Перл — 1) сокровище, драгоценность, нечто выдающееся в ряду подобных (перл создания) 2) нечто нелепое, смешное, бессмысленное, в частности нелепое высказывание |
| — из песни слов не выкинешь, Педивикия однако! |
Жил-был один веселый наркоман по имени Ларри Уолл. Жил — не тужил, курил козье дерьмо и языки разные изучал, пока не стукнуло в его умную голову придумать свой собственный язык… программирования. Забил свою трубку козьим калом, затянулся этот мэн и обозвал свое детище — Perl’ом. У некоторых возникает ассоциации со словом pearl, которое переводится как жемчужина. Они не ошиблись: сам автор называет свой язык жемчужиной. Perl — это аббревиатура, расшифровывающаяся как Practical Extraction and Report Language (практический язык для извлечения неведомой ебаной хуиты данных и составления отчетов), некоторые извращенцы (сам автор по «man perl») называют его Pathologically Eclectic Rubbish Lister (патологически эклектичный мусорный листер), более точный перевод Патологический разгребатель перемешанного мусора.
В Рашке также называется ПЕРДЛ, что расшифровывается от китайского «Почему Если Работает Делать Лучше», или, как говаривал, бывало, Дэн Сяопин, «Неважно, какого цвета кошка, лишь бы она ловила мышей».
Здесь текстовый вывод от первой проги передаётся на вход второй, она читает его и разбирает (с помощью рехекспоф), затем её текстовый вывод передаётся третьей проге и так далее, ну ты понел. В этом качестве Перл полезен, удобен и прекрасен, а писать такие скрипты на нём — прельстиво и тепло. В качестве среды разработки и выполнения web-скриптов он малопригоден и для описания бизнес-процессов изначально предназначен не был. Ну не был, и всё.
References to Functions
This might happen if you need to create a signal handler so you can produce a reference to a function by preceding that function name with \& and to dereference that reference you simply need to prefix reference variable using ampersand &. Following is an example −
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach $item (%hash) {
print "Item : $item\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Create a reference to above function.
$cref = \&PrintHash;
# Function call using reference.
&$cref(%hash);
When above program is executed, it produces the following result −
Item : name Item : Tom Item : age Item : 19
Previous Page
Print Page
Next Page
Perl Equality Operators
These are also called relational operators. Assume variable $a holds 10 and variable $b holds 20 then, lets check the following numeric equality operators −
| Sr.No. | Operator & Description |
|---|---|
| 1 |
== (equal to) Checks if the value of two operands are equal or not, if yes then condition becomes true. Example − ($a == $b) is not true. |
| 2 |
!= (not equal to) Checks if the value of two operands are equal or not, if values are not equal then condition becomes true. Example − ($a != $b) is true. |
| 3 |
<=> Checks if the value of two operands are equal or not, and returns -1, 0, or 1 depending on whether the left argument is numerically less than, equal to, or greater than the right argument. Example − ($a <=> $b) returns -1. |
| 4 |
> (greater than) Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true. Example − ($a > $b) is not true. |
| 5 |
< (less than) Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true. Example − ($a < $b) is true. |
| 6 |
>= (greater than or equal to) Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true. Example − ($a >= $b) is not true. |
| 7 |
<= (less than or equal to) Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true. Example − ($a <= $b) is true. |
Below is a list of equity operators. Assume variable $a holds «abc» and variable $b holds «xyz» then, lets check the following string equality operators −
| Sr.No. | Operator & Description |
|---|---|
| 1 |
lt Returns true if the left argument is stringwise less than the right argument. Example − ($a lt $b) is true. |
| 2 |
gt Returns true if the left argument is stringwise greater than the right argument. Example − ($a gt $b) is false. |
| 3 |
le Returns true if the left argument is stringwise less than or equal to the right argument. Example − ($a le $b) is true. |
| 4 |
ge Returns true if the left argument is stringwise greater than or equal to the right argument. Example − ($a ge $b) is false. |
| 5 |
eq Returns true if the left argument is stringwise equal to the right argument. Example − ($a eq $b) is false. |
| 6 |
ne Returns true if the left argument is stringwise not equal to the right argument. Example − ($a ne $b) is true. |
| 7 |
cmp Returns -1, 0, or 1 depending on whether the left argument is stringwise less than, equal to, or greater than the right argument. Example − ($a cmp $b) is -1. |