Скрипты — Моя статья: Основы программирования на Perl
Статья под катом
Так получилось, что я знаю как минимум двух человек, которые в настоящее время хотели бы выучить Perl. Специально для них я решил написать этот пост.
В нем вы найдете примеры простых программ из серии ‘вывести числа от 1 до 5′ и тому подобное. Мне всегда нравилось учиться на примерах – это интереснее и быстрее, чем по книжкам или на семинарах. Также можете посмотреть посты этого блога, имеющие метку Perl – велика вероятность, что в них вы найдете еще примеры.
Я предполагаю, что в школе/институте вы изучали Pascal/Delphi, C или хотя бы Basic, и объяснять, что такое функция и циклы не требуется. Если это не так – ничего страшного, просто для того, чтобы во всем разобраться, вам придется потратить лишнее время на чтение Википедии. Если вы не знаете, как запустить bash-скрипт, или для чего в первой строке скрипта писать что-то вроде #!/bin/sh, придется немного погуглить, чтобы это выяснить.
Специально для тех, кого интересуют вопросы, «а правда ли, что Perl очень сложен», «а какие книжки по Perl можете посоветовать» и даже «эээ… а что, на нем еще пишут?», я написал Mini-FAQ по Perl, которое вы можете прочитать на HabraHabr. А для тех, кто неасилил многабукв здесь я приведу краткое его содержание:
- Perl – современный язык программирования, на котором пишут и будут писать еще очень долго.
- Perl, как и любой другой язык программирования, имеет свои достоинства, недостатки и области применения. Существует действительно большой класс задач, которые Perl решает на 5+.
- Синтаксис Perl не сложнее синтаксиса C++ или Java. В этом вы сможете убедиться, дочитав данный пост до конца.
- Существуют хорошие и при этом недорогие учебники по Perl. Также в сети вы без труда найдете сообщество perl-программистов, говорящих на вашем родном языке.
- Perl хорошо работает как под операционными системами семейства UNIX, так и под
ЗломWindows.
Привет, %username%!
Итак, давайте уже напишем наш первый скрипт на Perl!
1
2 3 4 |
#!/usr/bin/perl
$name = shift(); print("Hello, $name!\n"); |
Запускаем скрипт:
$ ./1.pl afiskon
Hello, afiskon!
Тут все очень просто:
- Имена скалярных переменных (то есть не массивов и не хэшей, что это такое – см ниже) начинаются со знака доллара
- Функция shift возвращает очередной аргумент скрипта. Другими словами первый вызов shift() возвращает первый аргумент, второй вызов – второй аргумент и так далее
- Функция print() выводит строку, переданную в качестве аргумента.
- В строку можно подставлять значения переменных (см строку 4). Подробнее о строках – см далее.
Если пока не очень понятно – ничего страшного. Возможно, немного теории внесет чуть больше ясности.
Типы переменных
В Perl существует три основных типа переменных: скаляры (числа и строки), массивы – подобно тем, что используются в Pascal или C (иногда массивы еще называют векторами), и хэши (ассоциативные массивы).
Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров.
1
2 3 4 5 6 7 8 9 10 11 12 |
#!/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 также поддерживает операцию возведения в степень:
Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\"), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд.
Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от контекста. Все просто:
# ^ числовой контекст, строка "11" преобразуется в число,
# после чего выполняется сложение, результат: 33.
$str1 = "11" . 22;
# ^ строковый контекст, число 22 преобразуется в строку,
# после чего выполняется конкатенация, результат: "1122".
Правила преобразования из строки в число и наоборот тут те же, что и в PHP:
# ^ результат - "abc", число ноль преобразуется в пустую строку
$int1 = "aaa" + 1;
# ^ результат - 1, в строке "aaa" нет цифр
$int2 = "12aaa" + 1;
# ^ результат - 13, учитываются только первые цифры строки
Кстати, для объявления длинных строк существует специальный оператор – qq:
$message = qq {
Hello, $username!
How are you?
};
Работа с массивами происходит следующим образом:
1
2 3 4 5 6 7 8 |
#!/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:
# аналогично ("aaa", "bbb", "ccc"), только короче
Хэши похожи на массивы, но элементы в хэше не упорядочены. При этом в качестве ключа, по которому производится доступ к элементу, могут использоваться строки.
1
2 3 4 5 6 7 8 9 10 11 12 13 |
#!/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 – это совершенно независимые друг от друга переменные разного типа.
В этом месте я хотел перейти к условным операторам и циклам for/while в perl, но понял, что для одного поста текста и так уже многовато. Между тем за кадром остались многие вопросы:
- Условные операторы
- Циклы for и while
- Объявление функций
- Работа с потоками и файлами
- Строгий синтаксис
- Использование готовых модулей и классов
Об этом я напишу в одной из следующих статей. Хотелось бы получить хотя бы парочку комментариев на этот пост – интересно/неинтересно, понятно/непонятно и так далее. Кстати, если у вас есть вопросы, связанные с Perl (не обязательно с этим постом) – смело задавайте их в комментариях!
Надеюсь, серия постов о программировании на Perl поможет вам написать ваши первые простенькие скрипты на perl. Со временем скрипты будут становится сложнее, в них станут использоваться новые технологии (ООП, регулярные выражения) и через какое-то время вы обнаружите, что знаете о Perl достаточно, чтобы делиться опытом с другими.
Источник http://eax.me/perl-basics/