Привет тебе, начинающий Перл-кодер. Perl язык старый, но проверенный и надежный, однако несмотря на это до сих пор остаётся армия несведущих в этом вопросе. За устранение этого пренеприятнейшего факта я и возьмусь. Задача не из легких, но дорогу осилит идущий, так что поехали!
Начну с нуля и по порядку. Прежде всего любой скрипт должен начинаться верхней строчкой, указывающей адрес к Перлу. Например, так:
#!/usr/bin/perl или
#!/usr/local/bin/perl.
Если не уверен, спроси у администратора.
Также Перл-скрипт должен иметь
соответствующий суффикс. Обычно это .pl , но может быть и .cgi. Опять же осведомись у своего админа.
Теперь, пожалуй, самое главное - синтаксис Перла.
1) Любое действие должно заканчиваться точкой с запятой ";"
Пример:
$a=3+4;
2) После символа # и до конца строки следуют комментарии, то есть эту часть кода компилятор просто проигнорирует.
Пример:
# комментарий
$a=3+4; # tozhe kommentariy 🙂
3) Основные типы данных
Наиболее употребляемые типы данных
::Числа::
В Перле поддерживаются практически все форматы чисел, например:
целые ->
13
80
-31337
вещественные ->
1.675
-6.55
числа с плавающей запятой ->
5.7e4 (то есть 5.7 умноженное на 10 в 4 степени)
-5.7e-5 (то есть 5.7 умноженное на 10 в минус 5 степени)
::Строки::
Строки между одинарными кавычками.
Все символы, заключенные между двух одинарных кавычек воспринимаются, как есть, кроме двух исключений. Это сама одинарная кавычка и символ обратной косой.
Примеры:
'Hello, Perec!'; # здесь всё понятно.
'Hello, \'Perec\''; # Тоже самое, только теперь "Perec" в одинарных кавычках
'Hello, \\Perec\\'; # Теперь "Perec" заключен между двумя обратными косыми.
'Hello, Perec
und Perechnici'; # Текст на двух строках
Строки между двойными кавычками.
Отличаются от обычных тем, что в них существуют специальные управляющие символы и вместо переменных подставляется их значение (смотри ниже).
Основные управляющие символы то "\n" - переход на новую строку и "\t" - табуляция.
Примеры:
"Hello, \nCoder" # слово Hello, переход на новую строку и слово Coder
$a=31337;
"Hello, $a Coder\n" # Hello, 31337 Coder и переход на новую строку.
Данные сами по себе это очень хорошо, но бесполезно. Их нельзя хранить или совершать над ними какие-либо операции. Надо бы нам их запомнить. Хоть я и рассматривал числа и строки отдельно, но, на самом деле, это, по сути, одно и тоже и для их хранения подходит один и тот же тип переменной - скалярная переменная. Для её объявления служит символ знак доллара "$". Имена переменных должны начинаться с буквы. Имя переменной ограничивается 255 символами. Отличаются большие и маленькие буквы. Для присваивания переменной значения служит знак равенства "=".
Примеры:
$a=5;
$a=$b=5 # присваивается переменным $a и $b число 5
$Super_31337_variable='Pupkin';
Действия над числами:
$a=3+5; # сложение
$b=5-3; # вычитание
$c=$a+$b; # присвоение $c результата сложения $a и $b
$d=5*7; # умножение
$e=.5.6/7.7; # Деление 5.6 на 7.8
$g=6**3; # возведение 6 в степень 3
$cool++; # увеличивает значение $cool на 1
$sux--; # уменьшает значение $sux на 1
Операции логического сравнения для чисел
При сравнении двух чисел сравниваются их значения и возвращается значение "истина" (true) в случае правильности убеждения и "ложь"(false) в противном случае. Например, 2>1 даёт значение true, а 5>6 даёт false.
Виды операций сравнения:
< # меньше
> # больше
<= # меньше или равно
>= # больше или равно
== # равно
!= # не равно
Действия над строками
Всего одно - конкатенация, то есть сложение строк. Обозначается одной точкой.
Например:
$a = "Privet ";
$b = "Xakep!";
$c = $a . $b . "\n"; # $c присвоилось "Privet Xakep\n";
Операции логического сравнения для строк
lt # меньше
gt # больше
le # меньше или равно
ge # больше или равно
eq # равно
ne # не равно
Сравниваются строки в порядке возрастания их ASCII значения.
Стоит отметить разницу между апострофами и кавычками, использующихся в присваивании. В кавычках осуществляется подстановка переменных и спец. символов, а в апострофах нет. Чтобы игнорировать подстановку в кавычках, следует перед спец. символом поставить слеш ( \ ).
$x='perem1';
print 'Var = $x'; или print "Var = \$x"; # Выведет 'Var = $x'
print "Var = $x"; # Выведет 'Var = perem1'
Массивы
Массивы начинаются с символа @ и конструируются следующим образом:
@array1=(1,2,3,4,5);
@array2=(30,40,@array1); # Добавление к @array2 всех элементов @array1
@array3=($perem1,$perem2,$perem3);
Обращение к элементам массива осуществляется так:
@array1=(1..20);
@array1[2,10,20]=(20,3,4); # Замена элементов под номерами 2 10 и 20 числами 20 3 и 4
@array1[20,1]=@array1[1,20] # Меняет элементы местами
Обращаться к отдельному элементу массива (скаляру) можно в форме $имя_массива[индекс]. Для массивов существуют также такие функции как push(), pop(), shift(), unshift().
push(@array1,$perem1); # Добавляет $perem1 в конец @array
unshift(@array,$perem1); # Добавляет $perem1 в начало @array
$perem1=pop(@array1); # Присваивает $perem1 последнему элементу массива @array
$perem1=shift(@array); # Тоже самое с первым элементом
Хэши
Хэш - массив, состоящих из пар "Ключ-значение". Доступ к каждому значению записи осуществляется по ассоциированному с ним ключу. Хэш выглядит так: %имя_хэша. Доступ к отдельным его элементам: $имя_хэша{выражение}.
Конструкция хэша выглядит следующим образом:
$hash{1}="key1";
$hash{'myset'}="www.rambler.ru";
$hash{1+2}=50;
%hash(1,20,2,100); # Чётное кол-во элементов обязательно!
# Запись аналогична $hash{1}=20; $hash{2}=100;
Удаление элементов из хэша производится с помощью операции delete:
delete($hash{1});
Выделить отдельные ключи и значения хэша можно при помощи функций keys() и values() соответственно:
%hash(1,20,2,100,3,'test');
@key=keys(%hash); # @key=(1,2,3);
@value=values(%hash) # @value=(20,100,'test');
Операторы
Наконец, мы подошли к изучению операторов Perl. Набор операторов в нём огромен. Мы рассмотрим самые важные и простые.
Оператор if имеет 2 формы:
if(условие)оператор;
оператор if условие;
В пару к if имеется оператор unless означающий if с отрицанием:
unless(($method eq "GET")||($method eq "POST")) {
print "Unknown method";
}
print "Ok" unless $y > $x;
Также и с циклическим блоком while. Ему в пару существует оператор until означающий отрицание while. Например вместо:
while(!eof(FILE)) {
# Операторы ...
}
можно написать:
until(eof(FILE)) {
# Операторы ...
}
Синтаксис оператора for выглядит следующим образом:
for($i=0;$i<10;$i++) { # Выходим из цикла при $i<10
print $i; # Начальное значение $i=0
} # При каждой прокрутке цикла увеличиваем $i на 1
Следующий оператор foreach предназначен специально для массивов и предоставляет возможность пройтись по всем его элементам, поочерёдно присваивая каждый элемент
какой-то переменной:
foreach $переменная (@массив) {
# Операторы...
}
или
foreach (@массив) {
# Операторы
}
В последнем примере используется особенность Perl - переменная по умолчанию $_. Именно ей присваивается каждый элемент массива. Данная переменная сопоставляется и с регулярными выражениями, например фрагмент кода:
@data=
foreach(@data) {
chomp;
print if /^From:/;
}
аналогичен такому:
@data=
foreach $_ (@data) {
chomp ($_);
print $_ if $_=~/^From:/;
}
Регулярные выражения
Пожалуй самым большим преимуществом языка Perl над другими является поддержка регулярных выражений. Синтаксически регулярное выражение записывается между слэшами: /regular/.
Вот самый простой пример применения регулярных выражений:
if (/abc/) {
print "$_ содержит abc\n";
}
А вот пример посложнее:
if(/(ftp|http):\/\/([^\/]+)(.*)/){
print "Протокол: $1\n";
print "Сервер: $2\n";
print "Документ: $3\n";
}
Рассмотрим специальные символы, входящие в регулярные выражения: Конструкция Значение Пример использования
Конструкция | Значение | Пример использования |
. | Соответствует любому символу |
print if /ab.c/; |
[множество символов] |
Соответствует любому символу из данного множества |
/[abc]d/; # Соответствует ad, bd и cd |
[^множество символов] |
Отрицание множества символов |
/^[xyz]/; # Соответствует всему, что не содержит x, y или z |
(...) | Группировка элементов с их запоминанием в переменные $1, $2, $3 и т.д. |
/(xyz)*//([abc]. [^xy]qwerty)/; |
(...|...|...) | Одна из альтернатив |
/(ftp|http|mailto)/; |
* | Повторение образца 0 или более раз |
/*./; # Соответствует всему |
? | Повторение 0 или 1 раз |
none |
+ | Повторение 1 или более раз |
none |
{n,m} | Повторение от n до m раз |
none |
{n} | Повторение ровно n раз |
none |
{n.} | Повторение n и более раз |
none |
^ $ | Соответствует началу и концу строки |
/^http/; /\.cgi$/; |
\t \r \n | Управляющие символы: табуляция, возврат каретки и перевод строки соответственно |
none |
\d (/D) | Соответствует цифре или отрицает её, аналог [0-9] ([^0-9]) |
none |
\w (/W) | Соответствует букве или отрицает её |
none |
\s (/S) | Соответствует пробелу или отрицает его (включая табуляцию и переход на новую строку) |
none |
\b (/B) | Соответствует границе слова или отрицает её |
$test1="this is test"; $test2="wise"; if($test1=~/\bis\b/) { print "1"; } # Соответствует if($test2=~/\bis\b/) { print "0"; } # Не соответствует /\Bis\B/ #соответтсвует 'wise' но не 'is' |
i | Игнорирует регистр |
if($test=~/test/i) { print "Not register"; } # Соответствует как test, так и TEST |
С помощью регулярных выражений можно также производить замену одних символов другими. Синтаксис замены: s/выражение/строка/;
Опция g осуществляет замену по всей строке (глобальная замена). Опция e используется для подстановки в выражение второй строки полностью. Рассмотрим пример замены:
$x="This is test";
$x=~s/ /_/g;
print $x; # Выведет "This_is_test"