Первый скрипт на Perl

Давайте напишем наш первый скрипт на Perl!

#!/usr/bin/perl

$name = shift();
print(«Hello, $name!\n«);

Запускаем скрипт:

$ chmod u+x 1.pl
$ ./1.pl afiskon
Hello, afiskon!

Тут все очень просто:

  • Имена скалярных переменных (то есть не массивов и не хэшей, что это такое — см ниже) начинаются со знака доллара.
  • Функция shift возвращает очередной аргумент скрипта. Другими словами первый вызов shift() возвращает первый аргумент, второй вызов — второй аргумент и так далее.
  • Функция print() выводит строку, переданную в качестве аргумента.
  • В строку можно подставлять значения переменных (см строку 4). Подробнее о строках — см далее.

Если пока не очень понятно — ничего страшного. Возможно, немного теории внесет чуть больше ясности.

Типы переменных

В Perl существует три основных типа переменных: скаляры (числа и строки), массивы — подобно тем, что используются в Pascal или C (иногда массивы еще называют векторами), и хэши (ассоциативные массивы).

Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров.

#!/usr/bin/perl

$a = 123;
$b = 7.496;
$c = 0xABC; # равно 2748, да, это комментарий 🙂
$d = ($a + $b) / $c;
$d *= $a; # тоже самое, что $d = $d * $a;

$str1 = «hello»;
$str2 = «$str1, world»; # в $str2 записано ‘hello, world’
$str3 = $a.«\n«.$str2;
$str4 = ‘$str1’; # в $str4 записано ‘$str1’, а не ‘hello’

Тут мы задаем положительные и отрицательные, целые и дробные числа, задаем число в шестнадцатеричной кодировке, складываем, умножаем и делим — все как в Си или Java. Кроме перечисленных операций Perl также поддерживает операцию возведения в степень:

$a = 2 ** 8; # результат: 256

Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\»), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд.

Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от операции. Все просто:

$int1 = «11» + 22;
# ^ строка «11» преобразуется в число,
# после чего выполняется сложение, результат: 33.
$str1 = «11» . 22;
# ^ число 22 преобразуется в строку,
# после чего выполняется конкатенация, результат: «1122».

Правила преобразования из строки в число и наоборот тут те же, что и в PHP:

$str1 = 0 . «abc»;
# ^ результат — «abc», число ноль преобразуется в пустую строку
$int1 = «aaa» + 1;
# ^ результат — 1, в строке «aaa» нет цифр
$int2 = «12aaa» + 1;
# ^ результат — 13, учитываются только первые цифры строки

Кстати, для объявления длинных строк существуют специальные операторы — q и qq:

# аналогично одинарным кавычкам
$text = q {
Do you have $15 ?
};
# аналогично двойным кавычкам
$message = qq {
Hello, $username!
How are you?
};

Работа с массивами происходит следующим образом:

#!/usr/bin/perl

$scalar = «bebebebe»;
($a, $b) = (1, 2); # тоже самое, что $a = 1; $b = 2;
@arr = («aaa», 123, $scalar, $a+$b);
print $arr[1].«\n«;
push @arr, $a;
print pop(@arr).«\n«;

Здесь мы создаем массив @arr, состоящий из 4-х элементов (строка 5). Затем выводим второй элемент (строка 6). Нумерация элементов начинается с нуля, поэтому для вывода второго по счету элемента используется индекс 1. Затем кладем в конец массива значение переменной $a (функция push, строка 7), и тут же извлекаем и выводим его (функция pop, строка 8).

Обратите внимание, имена массивов начинаются с «собаки», а не доллара (запомнить не сложно — соответствующие символы похожи на первые буквы английских названий типов: $ — scalar, @ — array). При обращении ко второму элементу массива (строка 6) использовался знак доллара, потому что элемент массива является скаляром. По началу это вызывает много путаницы, но вообще все логично.

Еще в этом скрипте мы вызываем функции print и push без скобок. В Perl при вызове функции, везде, где это не вызывает неопределенности, скобки можно опустить.

Для объявления массива, элементами которого являются строки без пробелов, существует специальный оператор — qw:

@arr = qw/aaa bbb ccc/;
# аналогично («aaa», «bbb», «ccc»), только короче

Хэши похожи на массивы, но элементы в хэше не упорядочены. При этом в качестве ключа, по которому производится доступ к элементу, могут использоваться строки.

#!/usr/bin/perl

%hash = ( # при объявлении хэшей и массивов можно
«x» => 12, # использовать перенос строк
y => 53, # если в ключе нет спец-символов, кавычки не нужны
«z» => 10.5, # запятую на конце можно оставлять
);

$hash{«x»}++; # координата по x теперь равна 13
$hash{y}—; # координата по y теперь равна 52

# выводим координаты
print «x = $hash{x}, y = $hash{y}, z = $hash{z}\n«;

Имена хэшей начинаются со знака процента, для обращения к элементу используются фигурные скобки (а не квадратные, как в случае с массивами). Если имя ключа заранее известно, можно указывать его без кавычек (строка 10).

Кстати, переменные $test, @test и %test — это совершенно независимые друг от друга переменные разного типа.