#!/usr/bin/env perl
Пришлось познакомиться с этим зверем. Текст тестового скрипта с которым я игрался: Perl Test Script for experiments
Презентации на основе которых я прокачал Perl
http://www.slideshare.net/gawd/crash-course-in-perl-perl-tutorial-for-c-programmers
http://www.sfu.ca/~zblair/perlForC.html
Стандартные модули
Находятся тут: www.cpan.org/modules
Для установки модулей cpan можно выполнить установку через гуёвый ppm, или через команд лайн
perl -MCPAN -e shell > install PACKAGE_NAME
perldoc -q installed -- информация про то как посмотреть список установленных модулей
Запуск интерпретатора
Реализация Perl под Windows представлена реализациями ActivePerl или Cygwin.
perl -d -e 1 - запуск интерпретатора в интерактивном режиме
perl -e "print 'hello1';" -e "print 'hello2';" - выполнение последовательно нескольких команд
perl hello.pl - запуск интерпретатора с чтением скрипта из файла
perl -c hello.pl - проверка синтаксической корректности скрипта без запуска такового
Примеры полезных пускаемых скриптов
perl -e "while(1) {$a = readline(); print \"\U$a\";}" -- читать строчки из stdin и выводить их в uppercase
Дополнительные книги и материалы
Perl array reference and dereference
Мне знаком C/C++, Bash, Python.
В сравнении с этими языками Perl чем-то похож на каждый из них, и в некотором смысле одновременно отличается от них.
0. Философенье про Perl
Ларри Уолл. Личное мнение - в сравнении с bash,python - язык просто ужасный.
1. В сравнении с Bash
1.1. Объявление локальных переменных требуют специального модификатора. Правда вместо local используется my.
1.2. Код возрата из system() располагается в $?. Нотация кода возврата как в bash. В bash не требуется использовать
какой-либо вызов функции для вызова стороннего бинарника. Инструкция просто пишется сама по себе в скрипте.
1.3. Как и bash апострофы могут быть использованы для работы с stdout запущенного процесса ``
1.4. $$ -- pid программы.
1.5. $0 -- имя программы. ("$" "ZERO")
1.6. Нотация функций очень похожа на bash правда вместо слово function используется sub.
В отличие от bash возвращать можно не только целые числа, но и строки и т.д. в Perl вызывать функцию можно как
foo(), так и &foo, так и foo, так и &foo()
И ЭТО КОШМАР #1, ЗАЧЕМ ИМЕТЬ СТОЛЬКО ВАРИАНТОВ ВЫЗОВА ФУНКЦИИ ОСОБЕННО
С ИСПОЛЬЗОВАНИЕМ &
Функция может принимать
1.6.1 любое кол-во аргументов sub f(@){return "return value\n";}
1.6.2 один аргумент sub f($){return "return value\n";}
1.6.3 два аргумент sub f($$){return "return value\n";},
таким же способом можно наращивать произвольное кол-во аргументов
1.6.4 не принимать аргументов вовсе sub f(){return "return value\n";}
КОШМАР #2:
ИМЕНОВАТЬ АРГУМЕНТЫ НЕЛЬЗЯ, ДЛЯ ДОСТУПА К АРГУМЕНТАМ
СЛЕДУЕТ ИСПОЛЬЗОВАТЬ МАССИВ @_
1.7. Проверять существование файла через специальный -X синтаксис
-e "file.txt" || warn("FILE NOT EXIST!"); -r "file.txt" || warn("FILE NOT READABLE!"); -w "file.txt" || warn("FILE NOT WRITEABLE!"); -d "dir" || warn("FILE IS NOT A DIRECTORY!");
(http://perldoc.perl.org/functions/-X.html)
1.8. Single Quotes работают как в bash
2. В сравнении с python
2. 1. Использование команды print при печати на stdout имеет синтаксис аналогичный print в python. Правда perl-ий print выводится без newline. Чтобы выводить строчку + newline как в python, требуется использовать команду say. С другой стороны чтобы python-ий print вставлял пробел вместо новой строчки требуется написать запятую в конце команды print print "text",
2.2 Комментарии, начинаются с #
2.3 Есть пакеты (package) синонимы в некотором смысле python-им модулям.
package my::nested_name::one_more_nested_name; -- объявления пакета.
Пакеты должны располагаться в соответствии с файловой организацией. Имя файла пакета и путь по директориям на файловой системе должно совпадать с именем указанной в директиве package.
В конце пакета должно вычисляться значение например инструкцией 1; Perl module on wiki
Расширение скриптовых файлов в Perl *.pl, в то время как у пакетов *.pm.
2.4 use PackName; # import PackName (использование пакета в perl через use аналогично keyword import в python)
В момент использования директивы use пакет загружается в память, в дальнейшем последующие вызовы use ни на что не влияют
2.5 Для дёрга функции в отличие от питоновской точки - требуется использовать C++ синтаксис с ::
PackName::SubName::func();
2.6 C:\Perl\lib -- здесь находятся основные пакеты (core packages)
2.7 В python есть поддержка классов, в Perl есть что-то похожее но всё таки есть некоторые особенности:
Как и в python
-- Все методы класса виртуальные.
-- Self передаётся неявно первым аргументов (первый аргумент в массиве аргументов @_)
Но:
КОШМАР #3 - НЕТ ВЫДЕЛЕННОГО КЛЮЧЕВОГО СЛОВА CLASS, для определения класса требуется создать пакет. И в пакете "подопределять" функции-методы, а метод с названием new - является конструктором.
2.8 do/while loop -- в Python отсутствует. В Perl, ровно как и в C++ этот оператор имеется.
2.9 Типы с точки зрения программиста судя по всему имеют семантику копирования по значению, в отличие от Python копирования по ссылке.
2.10 python -c "print 'hello'" эквивалентно perl -e "print 'hello';"
2.11 python-ий None в некотором смысле эквивалентен perl-му undef
2.12 Как и питоне в случае использование строк "str", или 'str' - соответствующую кавычку ' или " экранировать не надо.
3. В сравнении с С++
3.1 Инструкции кончаются так же на ";"
Есть исключение - последняя инструкция в программе может опционально не кончатся на ; но по документации Perl использование этого не желательно.
3.2 Блоки if, else. Кроме if else, есть сокращение для else if - elsif. Блоки должны всегда обрамляться фигурными скобками.
В C++ для одного оператора следующим за if это не обязательно.
В Perl фигурные скобки для циклов и условий обязательны всегда.
ЗАЧЕМ ЭТО. ПОЖАЛУЙ ВСЕ ЯЗЫКИ ГДЕ ELIF ВЫДЕЛЕНО В КЛЮЧЕВОЕ СЛОВО НЕ ПИШУТ ЕГО ТАК
3.3. Так же if(!exp){} эквивалентно unless(exp){}
3.4 Есть подобие тернарного оператора $a=$min if $a>$min;
3.5 Синонимы break/continue в циклах -- команды last/next
3.6 Конструкция switch на уровне языка недоступна
4. Необычное
4.1 Кроме обычных управляющих последовательностей в строковых константах подобных тем которые есть в C++,
есть ещё специальные управляющие последовательности \L \U \E.
Суть их в том, что содержимое строки между \L и \E или \U \E подлежат
специальной обработке по преобразованию букв в верхний или нижний регистр:
L - lowercase, U-UPPERCASE. Если \E не указана то преобразование выполняется до конца строки.
4.2 Хоть типы указывать "не надо", однако типы зашиты в названиях переменных
-- имя переменной скалярного типа и строкового типа и ссылочного типа должно начинаться с $
-- имя переменной типа массив должно начинаться с @, а элементы перечисляются в круглых скобках.
-- имя переменной типа ассоциативный map должно начинаться с %, а элементы перечисляются в круглых скобках. Ассоциативный массив в терминах perl-а называется хешом.
-- при обращении к элементам хеша, имя должно начинаться с $, а ключ передаётся в фигурных скобках.
-- при обращении к элементам массива, имя должно начинаться с $ или с @, а индекс передаётся в квадратных скобках.
4.3 Чтение неопределенной переменной приводит к результату аналогичному "". Никакие exception-ы не кидаются.
4.4 Наличие переменной можно проверить if (defined $er). Проверить можно только переменные скалярных и строковых типов. Элементы массивов и хешей.
4.5 Нативная (встроенная в язык). Поддержка регулярок.
4.6 Нативная (встроенная в язык). Поддержка файлов.
Имена файлов не должны использовать $,@,% и быть все в UPPERCASE, при использовании переменной файла требуется заключать её в угловые скобки. <FILENAME>
<STDIN> или <> -- это stdin
Можно открыть файл в режиме чтения, записи, чтения-записи, но ещё и в режиме Pipe-а для другой программы, как Input или Output.
4.7 Есть специальная переменная $_. Она в некотором смысле обладает семантикой слово it английского языка. Многие встроенные функции, при отсутствии явных аргументов для действия берут информацию из этой переменной.
$_="hello"; print; <=> print "hello";
4.8 В теле функции @_ ссылается на все аргументы функции. Функции оперирующие с массивами типа shift pop оперируют с @_, если для функция не задан аргумент и код выполняется внутри функции. Если эти операции дёрнуты вне функции - то для них используется @ARGV.
4.9 @ARGV хранит аргументы программы (скрипта). %ENV хранит переменные окружения.
4.10 Встроенная функция qw означающая 'quote word' используется для генерации массива слов из строки.
4.11 В PERL ЕСТЬ УКАЗАТЕЛИ. НОТАЦИЯ \$, или \@. ИСПОЛЬЗОВАТЬ ТОЛЬКО ПО НЕОБХОДИМОСТИ.
$a=123
$b=\$a
print $b -- печатает адрес
print $$b -- разыменование значения.
4.12 ИНОГДА СИНТАКСИЧЕСКИ НЕВОЗМОЖНО ИСПОЛЬЗОВАТЬ $$.
В этом случае следует воспользоваться $a->[0] или $a->{'key_name'}=123
4.13 МОЖНО ЗАБЫТЬ ИДЕНТИФИКАТОР undef $var; синоним del a в Python
4.13 Switch конструкция доступна в пакете use Switch.
4.14 Использования констант.
объявление: use constant B => 4096;
использование: print B;
4.15 Вообще говоря можно инициализировать массивы и хеши соответсвенно через [], {}, а не через (). Инициализируется reference на map/array. Обращаться в этом случае к элементам нужно через $$. Или через ->.
Или через @{$ref_to_array}, %{$ref_to_hash}. Например $a->{1}, $$a{1},
4.16 Обычный оператор равно сравнивает величины как не строки.
Для сравнения величин как строк следует использовать eq вместо оператора равно.
4.17 Часть кода которая незаимплеменчена можно записывать как "..."
4.18 Встроенные функции q() и qq() позволяют в некотором смысле эмулировать работу 'some text' и "some text"
4.19 Поддержка Here-doc синтаксиса в стиле bash, правда имеются проблемы его по eval-е при наличии Here-doc http://perldoc.perl.org/perlop.html#%3c%3cEOF
my $a=<<"EOF";
asdsad
EOF
my $a = <<'EE';
asd
asd
EE
4.20 Циклы for|foreach могут после основного блока {} иметь ветку continue. Которая определяет действие выполняемое в конце каждой итерации, независимо как закончилась итераций (или нормально, или через next|last)
4.3
python -c "import this"
Errors should never pass silently => perl break it
Simple is better than complex => code is written once. But read over and over. Fewer is clearer. perl break it.
4.4 В perl-е есть некоторые встроенные команды работы со строками
qq - строка в этом операторе выводится с кавычкам как есть (их экранировать не надо), замена переменных на их фактические значения выполняется.
q - тоже самое, что qw, но нет автоподстановка переменных (так называемой string_interpolation)
qw - описание того что qw бьет raw строчку пробелом на массив http://perldoc.perl.org/perlop.html,
автоподстановка переменных происходит
Встроенные переменные
$^V версия интерпретатора
$^X имя программы интерпретатора perl-а
$^O имя операционной системы
$! C runtime "errno" value
@INC - список директорий где искать модули. Выполняет роль аналогичную переменной окружения PYTHONPATH для питона.