Конспект PERL
PERL
переменные
Программные объекты для хранения данных во время выполнения программы.
Чтобы задать область видимости переменных, нужно их объявить явно. Для объявления переменных применяются такие ключевые слова:
my - переменные с лексической областью видимости;
our - глобальные переменные с лексической областью видимости;
local - временное скрытие глобальных переменных.
Чтобы явно отделить имя вставляемой переменной от последующих символов, нужно имя переменной после префикса заключить в фигурные скобки, вот таким образом:
"One${var}Two"
ESCAPE-ПОСЛЕДОВАТЕЛЬНОСТИ
∖a звонок (Alert, bell) или 0x07 в 16-теричном представлении
∖b возврат на шаг (Backspace) или 0x08
∖e символ "эскейп" (Escape) или 0x1B
∖f прогон страницы (Form feed) или 0x0C
∖n новая строка (Newline) или 0x0A
∖r возврат каретки (Return) или 0x0D
∖t табуляция (Tabulation) или 0x09
∖033 восьмеричный код символа (например, 033)
∖x1b шестнадцатеричный код символа (например, 1B)
∖Cc управляющая последовательность (например, Control+C)
∖x{263A} двухбайтный символ набора Unicode (например, ?)
∖N{sigma} именованный символ набора Unicode (например, ?)
∖" символ двойной кавычки (quote)
∖' символ одинарного апострофа (apostrophe)
∖∖ символ обратной черты (backslash)
∖$ любой другой символ, как он есть (например, знак доллара)
Специальные переменные:
$_ область ввода или поиска по образцу, используемая по умолчанию
$. номер текущей считанной строки из текущего входного файла
$/ разделитель входных записей (обычно - символ новой строки ∖n)
$] номер версии Perl (например, 5.008007)
$0 имя файла текущей исполняемой Perl-программы
$@ сообщение об ошибке при выполнении в блоках eval или doТернарный оператор:
Первый операнд - условное выражение, определяющее результат операции: если первый операнд истинный, то результатом будет значение второго операнда, иначе - значение третьего операнда. После первого операнда ставится знак вопроса, а после второго - двоеточие. Например:
($n < 0) ? 0 : --$n
$temperature < 20 ? 'холодно' : 'тепло'
$! текущий номер ошибки или сообщение об ошибке
$^E уточненное сообщение об ошибке
$^T время начала выполнения программы (в формате функции time)
Указания которые позволяют обращатся к специальным переменным по более понятным именам:
$ARG вместо $_
$INPUT_LINE_NUMBER - вместо $.
$INPUT_RECORD_SEPARATOR,$RS - вместо $/
$PERL_VERSION - вместо $]
$PROGRAM_NAME - вместо $0
$EVAL_ERROR - вместо $@
$OS_ERROR, $ERRNO - вместо $!
$EXTENDED_OS_ERROR - вместо $^E
$BASETIME - вместо $^T
** - возведение в степень (например, 2 ** 5 будет 32)
% - деление по модулю или остаток от деления
++ - автоинкремент или увеличение на 1
-- - автодекремент или уменьшение на 1
В префиксной форме значением выражения будет значение операнда после изменения, а в постфиксной - значение операнда до изменения. Особенности применения префиксной и постфиксной форм можно показать на таком простом примере:Тернарный оператор:
Первый операнд - условное выражение, определяющее результат операции: если первый операнд истинный, то результатом будет значение второго операнда, иначе - значение третьего операнда. После первого операнда ставится знак вопроса, а после второго - двоеточие. Например:
($n < 0) ? 0 : --$n
$temperature < 20 ? 'холодно' : 'тепло'
$n = 25; # начальное значение переменной $n
$x1 = $n++; # в $x1 сохранено 25, затем в $n стало 26
$x2 = ++$n; # в $n стало 27 и оно сохранено в $x2
$x3 = --$n; # в $n стало 26 и оно сохранено в $x3
$x4 = $n--; # в $x4 сохранено 26, затем в $n стало 25
Унарные операции (встроенные функции):
abs $x абсолютное значение $x abs -25 25
atan2 $y, $x арктангенс y/x в интервале от -р до + р atan2 25,5 1.37340077
cos $x косинус $x cos 25 0.99120281
exp $x возвращает e в степени $x exp 0.25 1.28402542
int $x целая часть от $x int 25.25 25
log $x натуральный логарифм $x log 25 3.21887582
rand случайное дробное число от 0 до 1 rand 0.97265625
rand $x случайное число от 0 до $x rand 25 23.0430603
srand начинает новую случайную последовательность для rand srand 1
sin $x синус $x sin 25 -0.1323518
sqrt $x квадратный корень из $x sqrt 25 5
time число секунд с начала отсчета (обычно с 01.01.1970) time 1139738006
localtime текущая или указанная дата и время localtime Sun Feb 12 14:55:25 2006
Сравнение строк:
eq равно (например, $s eq 'a' истинно)
ne не равно (например, $s ne 'Y' истинно)
lt меньше, чем (например, $s lt 'z' истинно)
gt больше, чем (напримТернарный оператор:
Первый операнд - условное выражение, определяющее результат операции: если первый операнд истинный, то результатом будет значение второго операнда, иначе - значение третьего операнда. После первого операнда ставится знак вопроса, а после второго - двоеточие. Например:
($n < 0) ? 0 : --$n
$temperature < 20 ? 'холодно' : 'тепло'ер, $s gt '9' истинно)
le меньше или равно (например, $s le 'b' истинно)
ge больше или равно (например, $s ge 'Z' истинно)
cmp строковое сравнение (например, $s cmp 'Z' вернет результат 1)
Операции со строками:
. конкатенация (например, 'X' . '=' . '25' даст строку 'X=25')
x репликация (например, 'Дa!' x 3 даст в результате строку 'Дa!Дa!Дa!')
Логические операции:
! логическое НЕ (например, ! undef($x) )
&& логическое И (например, $d >= 1 && $d <= 31 )
|| логическое ИЛИ (например, $m eq 'Dec' || $m eq 'Jan')
not логическое НЕ (например, not undef($x))
and логическое И (например, $d >= 1 and $d <= 31)
or логическое ИЛИ (например, $m eq 'D' or $m eq 'J' or $m eq 'F')
xor логическое ИСКЛЮЧАЮЩЕЕ ИЛИ (например, $d==1 xor $m eq 'J')
Побитовые операции:
~ побитовое НЕ (~ 0b1101 даст результат 0b0010)
& побитовое И (0b1010 & 0b0110 даст результат 0b0010)
| побитовое ИЛИ (0b1010 | 0b0110 даст результат 0b1110)
^ побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ ( 0b1010 ^ 0b0110 даст 0b1100)
Составные операции присваивания:
**= присвоить результат возведения в степень ($n **= 3)
*= увеличить в ($n *= 4 значит увеличить $n в 4 раза)
/= уменьшить в ($n /= 5 значит уменьшить $n в 5 раз)
%= присвоить остаток от деления на ($n %= 6)
+= увеличить на (например, $n += 7 значит прибавить к $n число 7)
-= уменьшить на (например, $n -= 8 значит вычесть из $n число 8)
&&= И с присваиванием ($n &&= 2 значит присвоить $n=2, если $n истинно)
||= ИЛИ с присваиванием ($n ||= 2 т.е. присвоить $n=2, если $n ложно)
&= И с присваиванием ($n &= 2 значит выполнить над $n операцию &2)
|= ИЛИ с присваиванием ($n |= 2 т. е. выполнить над $n операцию |2)
^= ИСКЛЮЧАЮЩЕЕ ИЛИ с присваиванием ($n ^= 2 т. е. $n =$n ^ 2)
<<= сдвинуть влево и присвоить ($n<<=2 значит сдвинуть $n на 2 разряда влево)
>>= сдвинуть вправо и присвоить ($n>>=2 т. е. сдвинуть $n на 2 разряда вправо)
.= сцепить и присвоить ($n .= '2' значит сцепить $n с '2')
x= повторить и присвоить ($n x= 2 значит сцепить $n с собой 1 раз)
Тернарный оператор:
Первый операнд - условное выражение, определяющее результат операции: если первый операнд истинный, то результатом будет значение второго операнда, иначе - значение третьего операнда. После первого операнда ставится знак вопроса, а после второго - двоеточие. Например:
($n < 0) ? 0 : --$n
$temperature < 20 ? 'холодно' : 'тепло'
Ассоциативность и приоритет операций (от высокого к низкому).
Ассоциативность Приоритет Операция
Слева 24 термы и операции над списками (справа налево)
Слева 24 -> (вызов метода, разыменование)
Не ассоциативные 22 ++ -- (автоинкремент, автодекремент)
Справа 21 ** (возведение в степень)
Справа 20 ! ~ ∖ + - (логическое НЕ, побитовое отрицание, операция ссылки, унарный плюс, унарный минус)
Слева 19 =~ !~ (привязка к шаблону: совпадение, несовпадение)
Слева 18 * / % х (умножение, деление, деление по модулю, повторение строки)
Слева 17 + - . (сложение, вычитание, конкатенация строк)
Слева 16 << >> (побитовый сдвиг влево или вправо)
Не ассоциативные 15 именованные унарные операции и операции над файлами
Не ассоциативные 14 < > lt gt le ge (меньше, больше, меньше или равно, больше или равно и их строковые эквиваленты)
Не ассоциативные 13 == != <=> eq ne cmp (равно, не равно, сравнение и их строковые эквиваленты)
Слева 12 & (побитовое И)
Слева 11 | ^ (побитовое ИЛИ, побитовое исключающее ИЛИ)
Слева 10 && (логическое И)
Слева 9 || (логическое ИЛИ)
Не ассоциативные 8 .. ... (не включающие или включающие граничные значения диапазоны)
Справа 7 ?: (операция выбора или условная операция)
Справа 6 = += -= *= и т. д. (присваивание и присваивание с вычислением)
Слева 5 , => (запятая и запятая-стрелка)
Не ассоциативные 4 операции над списками (слева направо)
Справа 3 not (логическое НЕ)
Слева 2 and (логическое И)
Слева 1 or xor (логическое ИЛИ, логическое исключающее ИЛИ)
Минимальная синтаксическая единица языка программирования называется термом. Терм (term) - это все то, что может служить операндом в выражении, например, литерал или переменная.
Управляющие структуры
Конструкция if (или оператор if), проверяющая истинность одного условия, в самом простом виде записывается так:
if (условие) { # проверка истинности условия
# действия, выполняемые,
# если условие истинно
}
# продолжение программы
или
if (условие 1) { # проверка истинности 1-го условия
# действия, выполняемые,
# если условие 1 истинно}
elsif (условие 2) { # проверка истинности 2-го условия
# действия, выполняемые,
# если условие 2 истинно
# ... здесь могут быть еще фразы elsif ...
elsif (условие N) { # проверка истинности N-го условия
# действия, выполняемые,
# если условие N истинно
} else {
# действия, выполняемые,
# если все условия ложны
}
# продолжение программы
При этом выполнится один из блоков действий
Теперь наоборот, ложность условия становится причиной выполнения каких-либо действий
unless (условие) { # проверка ложности условия
# действия, выполняемые,
# если условие ложно
} else {
# действия, выполняемые
# в противном случае
}
# продолжение программы
Циклы:
while (условие) { # проверка истинности условия продолжения
# действия, выполняемые,
# пока условие истинно
}
# продолжение программы
Каждый раз перед выполнением цикла проверяется условие продолжения: если оно истинно, то блок тела цикла повторяется, иначе цикл заканчивается и выполняется следующее предложение программы.
until (условие) { # проверка истинности условия окончания
# действия, выполняемые,
# пока условие ложно
}
# продолжение программы
если условие истинно, цикл заканчивается и выполняется следующее предложение программы, а если условие ложно, то блок тела цикла выполняется еще раз.
for (первое выражение; условие; второе выражение) {
# действия, выполняемые,
# пока условие истинно
}
# продолжение программы
Применяется для повторения действий с проверкой условия продолжения. Но в нем предусмотрены два дополнительных выражения для управления циклом. Первое из них выполняется один раз перед выполнением цикла, и в нем обычно выполняются начальные действия, такие как инициализация переменных. Второе выражение выполняется каждый раз после выполнения тела цикла и перед проверкой условия продолжения работы цикла.
Если при работе цикла требуется досрочно закончить его выполнение при наступлении какого-то события, то для этого можно воспользоваться оператором last, который прерывает выполнение цикла и переходит к выполнению предложения, следующего за циклом.
Пример, напечатать 10 случайных чисел от 0 до 0,5:
$i = 0;
while (1) {
$random = rand;
if ($i == 10) {
last; # ПРЕРЫВАЕМ выполнение цикла
}
if ($random < 0.5) {
print "∖n", $random;
$i++;
}
}
# сюда произойдет переход по last
Оператор next применяется, когда требуется пропустить выполнение оставшихся предложений в теле цикла и перейти к следующей итерации, начав с проверки условия в заголовке цикла. Вот так можно изменить последний пример, применив next:
$i = 0;
while ($i < 10) {
$random = rand;
if ($random > 0.5) {
next;
}
print "∖n", $random;
$i++;
# сюда произойдет переход по next
}
Оператор redo используется, когда нужно повторить выполнение предложений в теле цикла без проверки условия в заголовке цикла. Вот таким станет последний пример, если использовать redo:
$i = 0;
while ($i < 10) {
#сюда произойдет переход по redo
$random=rand;
redo if $random>0.5;
print "∖n$random";
$i++;
}
Во всех рассмотренных циклах может присутствовать необязательный блок continue. В нем располагаются действия, которые нужно выполнить в конце цикла, в том числе при переходе к новой итерации по next. Действия в блоке continue не выполняются при переходах по last и redo. Это может показаться странным, но голый блок рассматривается в Perl как цикл, выполняющийся один раз. В таком блоке может присутствовать фраза continue и использоваться переходы last, next и redo. С учетом предложений управления циклом и блока continue циклическую структуру в общем виде можно изобразить так:
# может быть заголовок цикла: while, until или for
{
# сюда происходит переход по redo
# действие 1, выполняемое в цикле
if (условие выхода) {
last; # выход из цикла
}
# действие 2, выполняемое в цикле
if (условие продолжения) {
next; # выполнение следующей итерации цикла
}
# действие 3, выполняемое в цикле
if (условие возобновления) {
redo; # выполнение тела цикла сначала
}
# действие N, выполняемое в цикле
# сюда происходит переход по next
} continue {
# действие, выполняемое перед новой итерацией цикла
}
# сюда происходит переход по last
Циклы могут быть вложены один в другой. Когда требуется прервать вложенный цикл, перед ним ставится метка. Метка - это идентификатор, состоящий из латинских букв, знаков подчеркивания и цифр и начинающийся с буквы, после которого стоит знак двоеточия. Соблюдая хороший стиль программирования, следует записывать метки заглавными буквами. В операторе управления циклом метка указывает, выполнение какого цикла нужно прервать:
CYCLE_1:
while (условие продолжения цикла 1) {
CYCLE_2:
while (условие продолжения цикла 2) {
if (условие выхода из всех циклов) {
last CYCLE_1;
}
CYCLE3:
while (условие продолжения цикла 3) {
if (условия прерывания 2-го цикла) {
next CYCLE_2;
}
}
# сюда произойдет переход по next CYCLE_2
}
}
# сюда произойдет переход по last CYCLE_1
Прагмы:
use strict; # ограничить применение небезопасных конструкций
use warnings; # выводить подробные предупреждения компилятора
use diagnostics; # выводить подробную диагностику ошибок
use constant; #определять в программе именованные константы, которые по традиции записываются заглавными буквами.
use locale; #в программе включается действие национальных системных установок для некоторых встроенных функций, например, при работе со строками на русском языке
Функции работы с массивами
Встроенная функция shift поочередно извлекает из массива элементы, начиная с первого. Она удаляет из массива первый элемент, возвращая его значение. Когда shift применяется к пустому списку, она возвращает неопределенное значение.
Пример:
my $a = shift @mass;
Значения элементов массива, интерполируются в строках, заключенных в двойные кавычки. Целые массивы тоже интерполируются, если имя массива появляется в строке, обрамленной двойными кавычками. При этом значения элементов массива разделяются символом, хранящимся в специальной переменной $" (по умолчанию - пробелом). Можно например двоеточием:
$" = ':';
print "@array";
Существует противоположная shift функция unshift, которая вставляет свои аргументы в массив перед первым элементом, сдвигая существующие элементы вправо.
Пример:
unshift @mass, 4,5,6;
#или
@mass=(1,2,3, @mass);
print "$_" foreach @mass;
Операция push, добавляет элементы в конец массива:
push @mass, 7,8;
#или
@mass=(@mass, 9,10);
print "$_" foreach @mass;
Функция pop, которая удаляет последний элемент массива, возвращая его значение:
$b = pop @mass;
print "∖n$b∖n";
print "$_" foreach @mass ;
Функция splice, удаляет идущие подряд элементы массива, заданные индексом первого элемента и количеством удаляемых элементов, и заменяет их новым списком (если он указан), возвращая список удаленных элементов.
my $ind =5; #индекс - с какого элемента начинать
my $size=3; #кол-во элементов
my @del= splice @mass, $ind, $size, qw(новый список);№
print "$_" foreach @del;
print "∖n";
print "$_" foreach @mass;
функция sort, возвращает список, отсортированный по возрастанию строковых значений элементов
@mass = qw(6 14 4 21 1 38 2 3 5 7);
print "∖nдля сортировки@mass";
@mass = sort @mass;
print "∖nпосле сортировки@mass∖n";
Результат:
для сортировки6:14:4:21:1:38:2:3:5:7
после сортировки1:14:2:21:3:38:4:5:6:7
Для сравнения чисел это проще всего сделать с помощью операции <=>
splice @mass, 0, 10, qw(6 14 4 21 1 38 2 3 5 7);
@mass = sort {$a <=> $b} @mass;
print "∖nпосле сортировки@mass∖n";
Вывод:
после сортировки1:2:3:4:5:6:7:14:21:38
Для выполнения сортировки по убыванию достаточно поменять переменные местами {$b <=> $a }.
Для сортировки в обратном порядке строковых значений нужно применить операцию сравнения строк {$b cmp $a }. Вместо блока можно вызвать пользовательскую подпрограмму, выполняющую сколь угодно сложные сравнения элементов.
Встроенная функция reverse выполняет перестановку всех элементов списка в обратном порядке, возвращая инвертированный список, не меняя исходного.
my @mass1;
@mass1 = reverse @mass; #mass не меняется
print "∖n@mass∖n";
print "reverse @mass1∖n";
Функция map позволяет выполнить действия над всеми элементами массива.
@result = map ВЫРАЖЕНИЕ, СПИСОК
@result = map БЛОК СПИСОК
Она вычисляет выражение или блок для каждого элемента списка и возвращает список результатов. С ее помощью, например, можно выполнить арифметическое действие над всеми элементами списка:
@result = map $_*10, (11, 32, 55); # работа со списком
# в @result будет (110, 320, 550)
При работе map специальная переменная $_ локально устанавливается как синоним текущего элемента списка, поэтому изменение переменной $_ приводит к изменению соответствующего элемента массива. Таким способом можно изменять значения элементов массива.
Пример:
@mass = map {if ($_%=3) {$_*2} else {$_=0}} (@mass);
print "∖n@mass∖n";
Результат: 2:4:0:2:4:0:2:4:0:4
Список можно преобразовать в строку с помощью встроенной функции join, которая преобразует каждый элемент списка к строке, объединяет отдельные элементы списка в одну строку, вставляя между элементами указанный разделитель, и возвращает полученную строку в качестве результата.
Пример:
@array = (5..10); # объединяемый список
$delimiter = ':'; # разделитель элементов списка в строке
$string = join $delimiter, @array; # объединение в строку
# теперь $string содержит '5:6:7:8:9:10'
Обратную операцию разделения строки по образцу на список строк выполняет встроенная функция split. Она разделяет строку по указанному разделителю и возвращает список составляющих строк. Можно ограничить число разделяемых подстрок, тогда строка будет разделена не более, чем на это число элементов. Пример:
$string = '5:6:7:8:9:10'; # исходная строка
$delimiter = ':'; # разделитель подстрок
$limit = 3; # число элементов
@strings = split $delimiter, $string, $limit; # разделение
# в @strings содержится ('5', '6', '7:8:9:10')
Операция повторения (репликации), чаще всего применяемая к строкам, может использоваться и для многократного повторения значений списка:
@mass = ('a'..'d') x 2;
print "@mass∖n";
Результат:
a:b:c:d:a:b:c:d
Сделать неопределеннымы значения элементов массива
@mass= (undef ()) x @mass;
#или
@mass= (undef ()) x scalar (@mass);
Ввод данных в массив из входного потока (строка в переменную)
for (@mass = (), my $n = 0; $n<4; $n++)
{
print "Введите значение", $n+1, ':';
$mass[$n] = <>;
}
print "@mass∖n";
Тоже, убирая символ перевода строки (chomp)
for (@mass = (), my $n = 0; $n<4; $n++)
{
print "Введите значение", $n+1, ':';
$mass[$n] = <>;
}
@mass=chomp @mass;
print "@mass∖n";
Похожая функция chop отсекает любой последний символ у строки (в скалярном контексте) или у каждого элемента списка (в списочном контексте) и возвращает последний отсеченный символ.