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

Global Special Filehandles

ARGV The special filehandle that iterates over command line filenames in @ARGV. Usually written as the null filehandle in <>.
STDERR The special filehandle for standard error in any package.
STDIN The special filehandle for standard input in any package.
STDOUT The special filehandle for standard output in any package.
DATA The special filehandle that refers to anything following the __END__ token in the file containing the script. Or, the special filehandle for anything following the __DATA__ token in a required file, as long as you’re reading data in the same package __DATA__ was found in.
_ (underscore) The special filehandle used to cache the information from the last stat, lstat, or file test operator.

Array Variables

An array is a variable that stores an ordered list of scalar values. Array variables are preceded by an «at» (&commat;) sign. To refer to a single element of an array, you will use the dollar sign ($) with the variable name followed by the index of the element in square brackets.


Here is a simple example of using array variables −

#!/usr/bin/perl

&commat;ages = (25, 30, 40);             
&commat;names = ("John Paul", "Lisa", "Kumar");

print "\$ages = $ages\n";
print "\$ages = $ages\n";
print "\$ages = $ages\n";
print "\$names = $names\n";
print "\$names = $names\n";
print "\$names = $names\n";

Here we used escape sign (\) before the $ sign just to print it. Other Perl will understand it as a variable and will print its value. When executed, this will produce the following result −

$ages = 25
$ages = 30
$ages = 40
$names = John Paul
$names = Lisa
$names = Kumar

seek

seek ДЕСКРИПТОР, СМЕЩЕНИЕ, ТОЧКА_ОТСЧЕТА

Текущая позиция в файле автоматически изменяется в соответствии с выполненными операциями чтения/записи. Ее можно изменить с помощью функции seek(), которой передаются в качестве параметров дескриптор файла, смещение и точка отсчета. Для связанного с дескриптором файла устанавливается новая текущая позиция, смещенная на заданное параметром СМЕЩЕНИЕ число байт относительно точки отсчета.

Параметр ТОЧКА_ОТСЧЕТА может принимать одно из трех значений:

  • 0 — начало файла
  • 1 — текущая позиция
  • 2 — конец файла

Смещение может быть как положительным, так и отрицательным. Обычно оно отрицательно для смещения относительно конца файла и положительно для смещения относительно начала файла. Для задания точки отсчета можно воспользоваться константами SEEK_SET,SEEk_CUP и SEEK_END из модуля IO::Seekable, которые соответствуют началу файла, текущей позиции и концу файла. Естественно, необходимо подключить этот модуль к программе с помощью ключевого слова use.

Например, следующие операторы устанавливают одинаковые текущие позиции в файлах:

use IO::Seekable; 
seek FILE1, 5, 0; 
seek FILE2, 5, SEEK_SET;

Для перехода в начало или конец файла следует использовать нулевое смещение относительно соответствующих точек отсчета при обращении к функции seek():

seek FILE1, 0, 0;   # Переход в начало файла
seek FILE1, 0, 2;   # Переход в конец файла

Основные части Perl скрипта

В общем случае любой Perl скрипт состоит из четырех ключевых частей:

  1. Настойка. Первая часть скрипта обязательно запускает интерпретатор и устанавливает переменный, используемые в теле скрипта. Для запуска интерпретатора необходимо знать правильный путь к программе.
  2. Чтение входных данных. Эта часть «считывает» и сохраняет в переменных входные данные в удобной для обработки форме. Эта часть обычно неизменна во всех скриптах.
  3. Обработка входных данных. Эта часть соответствующим образом обрабатывает введенные данные. Она может быть простой (около 5 строк) или очень сложной (более 1000 строк) в зависимости от выполняемой задачи.
  4. Вывод результатов. Пользователь обычно ожидает какого-либо ответа на свои действия. Эта часть достаточно проста в реализации.

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

Perl Assignment Operators

Assume variable $a holds 10 and variable $b holds 20, then below are the assignment operators available in Perl and their usage −

Sr.No. Operator & Description
1

=

Simple assignment operator, Assigns values from right side operands to left side operand

Example − $c = $a + $b will assigned value of $a + $b into $c

2

+=

Add AND assignment operator, It adds right operand to the left operand and assign the result to left operand

Example − $c += $a is equivalent to $c = $c + $a

3

-=

Subtract AND assignment operator, It subtracts right operand from the left operand and assign the result to left operand

Example − $c -= $a is equivalent to $c = $c — $a

4

*=

Multiply AND assignment operator, It multiplies right operand with the left operand and assign the result to left operand

Example − $c *= $a is equivalent to $c = $c * $a

5

/=

Divide AND assignment operator, It divides left operand with the right operand and assign the result to left operand

Example − $c /= $a is equivalent to $c = $c / $a

6

%=

Modulus AND assignment operator, It takes modulus using two operands and assign the result to left operand

Example − $c %= $a is equivalent to $c = $c % a

7

**=

Exponent AND assignment operator, Performs exponential (power) calculation on operators and assign value to the left operand

Example − $c **= $a is equivalent to $c = $c ** $a

Regular Expression Special Variables

$digit Contains the text matched by the corresponding set of parentheses in the last pattern matched. For example, $1 matches whatever was contained in the first set of parentheses in the previous regular expression.
$& The string matched by the last successful pattern match.
$MATCH
$` The string preceding whatever was matched by the last successful pattern match.
$PREMATCH
$’ The string following whatever was matched by the last successful pattern match.
$POSTMATCH
$+ The last bracket matched by the last search pattern. This is useful if you don’t know which of a set of alternative patterns was matched. For example : /Version: (.*)|Revision: (.*)/ && ($rev = $+);
$LAST_PAREN_MATCH

Open Function

Following is the syntax to open file.txt in read-only mode. Here less than < sign indicates that file has to be opend in read-only mode.

open(DATA, "<file.txt");

Here DATA is the file handle, which will be used to read the file. Here is the example, which will open a file and will print its content over the screen.

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";

while(<DATA>) {
   print "$_";
}

Following is the syntax to open file.txt in writing mode. Here less than > sign indicates that file has to be opend in the writing mode.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

This example actually truncates (empties) the file before opening it for writing, which may not be the desired effect. If you want to open a file for reading and writing, you can put a plus sign before the > or < characters.

For example, to open a file for updating without truncating it −

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

To truncate the file first −

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

You can open a file in the append mode. In this mode, writing point will be set to the end of the file.

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

A double >> opens the file for appending, placing the file pointer at the end, so that you can immediately start appending information. However, you can’t read from it unless you also place a plus sign in front of it −

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

Following is the table, which gives the possible values of different modes

Sr.No. Entities & Definition
1

< or r

Read Only Access

2

> or w

Creates, Writes, and Truncates

3

>> or a

Writes, Appends, and Creates

4

+< or r+

Reads and Writes

5

+> or w+

Reads, Writes, Creates, and Truncates

6

+>> or a+

Reads, Writes, Appends, and Creates

Прототипы функций

Стоит пояснить, как функции работают в Perl.

Зачастую разное понимание цели этого механизма приводит к холиварам с адептами других языков, утверждающих, что «у перла плохие прототипы». Так вот, прототипы в Perl не для жёсткого ограничения типов параметров, передаваемых функциям. Это подсказка для языка: как разбирать то, что передаётся для функции.

Авторы из PerlMonks объясняли это как “parameter context templates” — шаблоны контекста параметров. Детали на примерах ниже.

Есть, к примеру, абстрактная функция, которая называется my_sub:

Мы её вызываем следующим образом:

Функция напечатает следующее:

Получается, что в любую функцию Perl можно передать любое количество аргументов. И пусть сама функция разбирается, что мы от неё хотели.

В функцию передается «текущий массив», контекстная переменная. Поэтому запись вида:

… означает то же самое, что и:

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

Функция Perl с прототипами будет выглядеть так:

Прототипы функций записываются после имени функции в круглых скобках. Прототип $$;$ означает, что в качестве параметров необходимо присутствие двух скаляров и третьего по желанию, «;» отделяет обязательные параметры от возможных.

Если же мы попробуем вызвать её вот так:

… то получим ошибку вида:

А если так:

… то проверка прототипов не будет происходить.

Резюмируем. Прототипы будут работать в следующих случаях:

— Если функция вызывается без знака амперсанда (&). Perlcritic (средство статического анализа Perl кода), кстати говоря, ругается на запись вызова функции через амперсанд, то есть такой вариант вызова не рекомендуется. — Если функция написана перед вызовом. Если мы сначала вызовем функцию, а потом её напишем, при включённых warnings получим следующее предупреждение:

Ниже пример правильной программы с прототипами Perl:

В Perl существует возможность узнать, какой у функции прототип. Например:

выдаст:

Numeric Scalars


A scalar is most often either a number or a string. Following example demonstrates the usage of various types of numeric scalars −

#!/usr/bin/perl

$integer = 200;
$negative = -300;
$floating = 200.340;
$bigfloat = -1.2E-23;

# 377 octal, same as 255 decimal
$octal = 0377;

# FF hex, also 255 decimal
$hexa = 0xff;

print "integer = $integer\n";
print "negative = $negative\n";
print "floating = $floating\n";
print "bigfloat = $bigfloat\n";
print "octal = $octal\n";
print "hexa = $hexa\n";

This will produce the following result −

integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255

[править] Perl 6

Будущее Перла — Perl 6 (в это, по крайней мере, верит Создатель). Perl 6 существует в виде сферического в вакууме стандарта и допускает существование нескольких реализаций. Впервые про Него мир узнал в 2000 году и с переменным успехом знакомится и по сей день.

Есть еще несколько проектов по реализации спеки языка, но они либо заброшены, либо не представляют собой ничего серьезного.

Дао Perl 6:

  1. Любой набор символов в любой кодировке является синтаксически правильным Perl 6 кодом.
  2. Всегда есть бесконечное количество различных способов сделать это.
  3. Любой человек, писавший до этого на любом языке, может сразу писать на Perl 6. Он может даже не догадываться, что пишет на Perl 6. Если, конечно, не будет забывать ставить 1; в конце модулей.
  4. Можно перегружать 1;. Можно перегружать пробелы. Можно перегружать сорц-фильтры с помощью регулярных выражений, которые тоже можно перегружать.
  5. Perl 6 имеет эталонную реализацию, написанную на Perl 6 и не способную быть выраженной ни на каком другом языке. На Perl 6 эталонная реализация может быть выражена, но не за конечное время. Мы работаем над этим. Когда мы закончим, наступит Армагеддон (который тоже можно будет перегрузить).

1;

Свершилось

И спустя почти 15 лет наконец дождались! Ларри Уолл официально представил Perl 6. Для тех, кому Perl 5 был слишком прост в освоении, добавили паттерн-матчинг и ленивые списки (а если серьёзно, то первая реализация Perl 6 была написана на Haskell, что логично), творчески переосмыслили нафиг весь синтаксис, а возможность менять его как угодно сделали основной фичей языка. А вы думали рандомный набор символов, как синтаксически правильный перлокод — это просто такая шутка была?

В результате получилось нечто весьма стрёмное. Адептов у сей поделки чуть более, чем нет: ньюфагов отпугивает охренительный порог входа и отсутствие вакансий, олдфаги негодуют от того, что сходство с пятеркой оканчивается на названии и повальной любви к регуляркам. В сухом остатке имеем еще один язык, который никому, кроме своих создателей нафиг не нужен. Что в определенной степени прискорбно: сил на него было потрачено немало, да и светлые идеи имеются в немалом количестве.

В чем различие между программой и скриптом?

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

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

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

print

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

V-Strings

A literal of the form v1.20.300.4000 is parsed as a string composed of characters with the specified ordinals. This form is known as v-strings.

A v-string provides an alternative and more readable way to construct strings, rather than use the somewhat less readable interpolation form «\x{1}\x{14}\x{12c}\x{fa0}».

They are any literal that begins with a v and is followed by one or more dot-separated elements. For example −

#!/usr/bin/perl

$smile  = v9786;
$foo    = v102.111.111;
$martin = v77.97.114.116.105.110; 

print "smile = $smile\n";
print "foo = $foo\n";
print "martin = $martin\n";

This will also produce the same result −

smile = 
foo = foo
martin = Martin
Wide character in print at main.pl line 7.

Autoload

В Perl одна из лучших систем управления модулями. Мало того что программист может контролировать ВСЕ стадии исполнения модуля, так ещё существуют интересные особенности, которые делают жизнь проще. Например, Autoload.

Суть Autoload в том, что когда функции в модуле не существует, Perl ищет функцию Autoload в этом модуле, и только затем, когда не находит, активируется исключение. Это значит, что мы можем описать обработчик ситуаций, когда вызывается несуществующая функция.

Например:

Очевидно, что функций qwerty и asdfgh не существует в пакете Autoload::Demo. В функции Autoload специальная глобальная переменная $AUTOLOAD устанавливается равной функции, которая не была найдена.

Вывод этой программы:

The Substitution Operator

The substitution operator, s///, is really just an extension of the match operator that allows you to replace the text matched with some new text. The basic form of the operator is −

s/PATTERN/REPLACEMENT/;

The PATTERN is the regular expression for the text that we are looking for. The REPLACEMENT is a specification for the text or regular expression that we want to use to replace the found text with. For example, we can replace all occurrences of dog with cat using the following regular expression −

#/user/bin/perl

$string = "The cat sat on the mat";
$string =~ s/cat/dog/;

print "$string\n";

When above program is executed, it produces the following result −

The dog sat on the mat

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.

[править] Философия

Корабль пустыни

Да, это он — Корабль пустыни

Афоризм, лежащий в основе Дао Perl’а, — TMTOWTDI — «There’s more than one way to do it» — «Есть более одного способа сделать это» и различные вариации на тему «Приятно быть важным, но куда важнее быть приятным» и снятия ограничений. Отсюда, следуя принципу TMTOWTDI, Perl (6) может прикинуться и пушистой змэйкой, так же эффективно выполняя тот же байт-код, оформленный более читаемо для питонщиков и иже с ними, ибо.

Маскотом Перла является верблюд с тех самых пор, как его изобразили на обложке первого издания книжки «Programming Perl». Неприхотлив, вынослив, благонадёжен. Любит сигареты Camel и шоколадки Picnic.

Может и оплевать, если захочет.

Стереотипы

До создания еретического Пыха был наиболее популярным языком для написания быдлоскриптов (счётчиков, гостевух и прочей хуиты) для быдлохоумпаг всяких Вась Пупкиных, не ведавших не то что про ООП, но даже про модуль CGI, и извлекавших переменные напрямую «руками» из QUERY_STRING. Особой мерзостью были зачислители платежей и биллинговые системы… которые до вас переписывали и после вас будут переписывать ещё 50 тысяч раз.

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

String Scalars

Following example demonstrates the usage of various types of string scalars. Notice the difference between single quoted strings and double quoted strings −

#!/usr/bin/perl

$var = "This is string scalar!";
$quote = 'I m inside single quote - $var';
$double = "This is inside single quote - $var";

$escape = "This example of escape -\tHello, World!";

print "var = $var\n";
print "quote = $quote\n";
print "double = $double\n";
print "escape = $escape\n";

This will produce the following result −

var = This is string scalar!
quote = I m inside single quote - $var
double = This is inside single quote - This is string scalar!
escape = This example of escape -       Hello, World

Positioning inside a File

You can use to tell function to know the current position of a file and seek function to point a particular position inside the file.

tell Function

The first requirement is to find your position within a file, which you do using the tell function −

tell FILEHANDLE
tell

This returns the position of the file pointer, in bytes, within FILEHANDLE if specified, or the current default selected filehandle if none is specified.

seek Function

The seek function positions the file pointer to the specified number of bytes within a file −

seek FILEHANDLE, POSITION, WHENCE

The function uses the fseek system function, and you have the same ability to position relative to three different points: the start, the end, and the current position. You do this by specifying a value for WHENCE.

Zero sets the positioning relative to the start of the file. For example, the line sets the file pointer to the 256th byte in the file.

seek DATA, 256, 0;

Замыкания (Closures)

Как сказано в википедии

По сути, замыкание — это аналог класса в ООП: предоставляет функциональность и данные связанные и упакованные вместе. Рассмотрим пример замыкания в Perl и класса в C++:

C++

Проведем анализ приведенного кода:

  • объявление приватной переменной:

    Perl:

    С++:

  • инициализирование приватной переменной:

    Perl:

    C++:

  • создание подпрограммы, перемножающей переданное ей значение с ранее инициализированной переменной:

    Perl:

    C++:

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

Определение объекта:

Использование:

Определение объекта:

Использование:

В C++ объект класса, в котором определен оператор определения , зачастую называют функциональным объектом, или функтором. Функциональные объекты чаще всего используются как аргументы для общих алгоритмов. Например, для того, чтобы сложить элементы вектора, можно использовать алгоритм for_each, который применяет переданную функцию к каждому элементу последовательности и класс Sum с перегруженным оперетором , который складывает все элементы последовательности и возвращает сумму. Также, вместо класса Sum можно использовать лямбды, которые появились в C++11.

Как видно из примера, в C++ мы объявляем класс , который содержит:

  • приватную переменной , которая инициализируется в стандартном конструкторе;
  • перегруженный оператор , который получает каждое значение посделовательности и суммирует в перемменую ;
  • метод для доступа к приватной переменной .

В примере на Perl мы создаем функцию , которая принимает ссылку на массив и анонимную функцию. Далее мы проходим по массиву, и выполняем анонимную функцию (замыкание), передавая ей в качестве параметра очередной элемент массива.

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

Аналогом функции-замыкания из примера на Perl, в C++ является использование лямбд, как показано в коде. В примере на Perl функция-замыкание, передаваемая в функцию, также называется колбеком, или функцией обратного вызова.

Dereferencing

Dereferencing returns the value from a reference point to the location. To dereference a reference simply use $, @ or % as prefix of the reference variable depending on whether the reference is pointing to a scalar, array, or hash. Following is the example to explain the concept −

#!/usr/bin/perl

$var = 10;

# Now $r has reference to $var scalar.
$r = \$var;

# Print value available at the location stored in $r.
print "Value of $var is : ", $$r, "\n";

@var = (1, 2, 3);
# Now $r has reference to @var array.
$r = \@var;
# Print values available at the location stored in $r.
print "Value of @var is : ",  @$r, "\n";

%var = ('key1' => 10, 'key2' => 20);
# Now $r has reference to %var hash.
$r = \%var;
# Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";

When above program is executed, it produces the following result −

Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110

If you are not sure about a variable type, then its easy to know its type using ref, which returns one of the following strings if its argument is a reference. Otherwise, it returns false −

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Let’s try the following example −

#!/usr/bin/perl

$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n";

@var = (1, 2, 3);
$r = \@var;
print "Reference type in r : ", ref($r), "\n";

%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "Reference type in r : ", ref($r), "\n";

When above program is executed, it produces the following result −

Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH

Regular-expression Examples

Character Classes

Sr.No. Example & Description
1

ython

Matches «Python» or «python»

2

rub

Matches «ruby» or «rube»

3

Matches any one lowercase vowel

4

Matches any digit; same as

5

Matches any lowercase ASCII letter

6

Matches any uppercase ASCII letter

7

Matches any of the above

8

Matches anything other than a lowercase vowel

9

Matches anything other than a digit

Special Character Classes

Sr.No. Example & Description
1

.

Matches any character except newline

2

\d

Matches a digit:

3

\D

Matches a nondigit:

4

\s

Matches a whitespace character:

5

\S

Matches nonwhitespace:

6

\w

Matches a single word character:

7

\W

Matches a nonword character:

Repetition Cases

Sr.No. Example & Description
1

ruby?

Matches «rub» or «ruby»: the y is optional

2

ruby*

Matches «rub» plus 0 or more ys

3

ruby+

Matches «rub» plus 1 or more ys

4

\d{3}

Matches exactly 3 digits

5

\d{3,}

Matches 3 or more digits

6.

\d{3,5}

Matches 3, 4, or 5 digits

Nongreedy Repetition

This matches the smallest number of repetitions −

Sr.No. Example & Description
1

<.*>

Greedy repetition: matches «<python>perl>»

2

<.*?>

Nongreedy: matches «<python>» in «<python>perl>»

Grouping with Parentheses

Sr.No. Example & Description
1

\D\d+

No group: + repeats \d

2

(\D\d)+

Grouped: + repeats \D\d pair

3

(ython(, )?)+

Match «Python», «Python, python, python», etc.

Backreferences

This matches a previously matched group again −

Sr.No. Example & Description
1

()ython&\1ails

Matches python&pails or Python&Pails

2

()*\1

Single or double-quoted string. \1 matches whatever the 1st group matched. \2 matches whatever the 2nd group matched, etc.

Alternatives

Sr.No. Example & Description
1

python|perl

Matches «python» or «perl»

2

rub(y|le))

Matches «ruby» or «ruble»

3

Python(!+|\?)

«Python» followed by one or more ! or one ?

Anchors

This need to specify match positions.

Sr.No. Example & Description
1

^Python

Matches «Python» at the start of a string or internal line

2

Python$

Matches «Python» at the end of a string or line

3

\APython

Matches «Python» at the start of a string

4

Python\Z

Matches «Python» at the end of a string

5

\bPython\b

Matches «Python» at a word boundary

6

\brub\B

\B is nonword boundary: match «rub» in «rube» and «ruby» but not alone

7

Python(?=!)

Matches «Python», if followed by an exclamation point

8

Python(?!!)

Matches «Python», if not followed by an exclamation point

Special Syntax with Parentheses

Sr.No. Example & Description
1

R(?#comment)

Matches «R». All the rest is a comment

2

R(?i)uby

Case-insensitive while matching «uby»

3

R(?i:uby)

Same as above

4

rub(?:y|le))

Group only without creating \1 backreference

Previous Page Print Page

Next Page  

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.

Match Operator Modifiers

The match operator supports its own set of modifiers. The /g modifier allows for global matching. The /i modifier will make the match case insensitive. Here is the complete list of modifiers

Sr.No. Modifier & Description
1

i

Makes the match case insensitive.

2

m

Specifies that if the string has newline or carriage return characters, the ^ and $ operators will now match against a newline boundary, instead of a string boundary.

3

o

Evaluates the expression only once.

4

s

Allows use of . to match a newline character.

5

x

Allows you to use white space in the expression for clarity.

6

g

Globally finds all matches.

7

cg

Allows the search to continue even after a global match fails.


С этим читают