afiskon 15.02.2010 21:07

СкриптыМоя статья: Основы программирования на Perl

По просьбе нескольких своих друзей я написал пост о программировании на 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");

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


$ chmod u+x 1.pl

$ ./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 также поддерживает операцию возведения в степень:


$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, учитываются только первые цифры строки

Кстати, для объявления длинных строк существует специальный оператор – 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:


@arr = qw/aaa bbb ccc/;
# аналогично ("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/


Тэги: Linux perl script
+ 10 -
Похожие Поделиться

exelens 15.02.2010 22:24 #
Перепостил целиком и указал источник.
В следующий раз прошу или делать пост-ссылку или сделать аналогично тому как сейчас =)
afiskon 15.02.2010 23:41 #
Ок, спасибо.
digiwhite 15.02.2010 22:27 #
Ну ИМХО написано вроде доступно. Хотя может быть потому, что я уже имею некоторый опыт и навык работы с другими ЯП.
bvk 15.02.2010 22:33 #
Тема работы с регэкспами не раскрыта.
exelens 15.02.2010 22:35 #
Нужно ли всё описывать в 1 статье?
Ведь 100 % что то упустишь. Или не?
bvk 16.02.2010 00:50 #
То, для чего перл предназначен, для чего и каким образом его суперудобно использовать, тут не описывается, а вместо этого автор рассказывает еще об одном PHP. Сейчас попробовал перечитать статью с точки зрения новичка и не понял, зачем мне заморачиваться с новым непонятным языком программирования, похожим на PHP, но не PHP, если я уже знаю PHP?

(Perl на протяжении многих лет был моим основным языком, если что)
digiwhite 15.02.2010 22:38 #
Это жешь введение :)
Username 15.02.2010 23:21 #
Спасибо, в мемориз, жду продолжения
Username 15.02.2010 23:22 #
booley 16.02.2010 07:39 #
Только хотел процитировать!
Tirador 16.02.2010 23:06 #
Жду продолжения.
f_evgeny 15.02.2010 23:21 #
Статья хорошая, но, почему не Python?
Я сам много писал на Perl, и сейчас пишу, но все-таки если есть возможность, выбираю Python.
afiskon 15.02.2010 23:42 #
Я не знаю Python. Хотя пробовал его изучать - по всей видимости хороший язык, документация с ним хорошая помнится шла.
f_evgeny 15.02.2010 23:48 #
Я бы назвал Python улучшенным Perl-ом. Сейчас приходится работать под Perl, очень не хватает буквально нескольких вещей. Сейчас перечислю, если бы их приделать к Perl, было бы супер:
- Простой синтаксис определения многомерных массивов:
a = <<1,2>,<3,4>>
- массивы массивов при передаче в функцию не становятся плоскими
- Простой синтаксис определения классов
afiskon 15.02.2010 23:51 #
Кажется, тут вам просто не хватает знания матчасти
1) @arr = (<1,2>, <3,4>);
2) my_func(\@arr);
sub my_func {
my ($ptr) = @_;
push @{$ptr-><0>}, 3;
}
3) Это да, ждем perl6.
f_evgeny 16.02.2010 10:45 #
Так я умею, мне как раз и нравится в Python то, что синтаксис создания, присваивания и передачи в функцию массивов в Python одинаковый, а в Perl - разный. Не надо лишний раз думать.
Т.е. что тут общего в Python и Perl? Общее удобство работы со списками и словарями. Но у Python это удобство взято и развито дальше.
afiskon 16.02.2010 10:51 #
Синтаксис - пожалуй, действительно единственное существенное отличие между Perl и Python. Ну тут, как говорится, на вкус и цвет. Кстати, буквально сегодня заказал книжку по Python (не люблю читать с монитора), давно хотел ознакомиться.
digiwhite 15.02.2010 23:55 #
Я бы назвал их совершенно разными языками. Несмотря на то, что они оба интерпретируемы.
f_evgeny 16.02.2010 10:46 #
Я не говорю, что они одинаковые, я говорю, что в Python подхвачены и улучшены идеи, заложенные в Perl.
Для меня Perl удобнее пожалуй в двух вещах:
- Написание однострочников
- Написание простых фильтров
Как только что-то чуть сложнее, сразу нужно брать Python.
kstep 17.02.2010 05:08 #
Могу не согласиться. Есть очень изящные и красивые решения задач на перле.
В частности в своё время писал достаточно большое коммерческое веб-приложение на перле. Тут скорее дело в том, что ты лучше знаешь: перл или питон.
kstep 16.02.2010 00:00 #
Есть многие вещи, которые в перле решаются намного проще. Сам пишу и на том, и на другом, но тексты парсить и анализировать гораздо удобнее перлом. В частности я далеко не в восторге от реализации поддержки Unicode в питоне, в перле это сделано намного лучше.
KblCb 16.02.2010 00:27 #
А почему Python?
f_evgeny 16.02.2010 10:48 #
По моему мнению сейчас это наиболее удобный и развитый универсальный язык.
KblCb 16.02.2010 23:54 #
По моему мнению, мягко говоря, нет. Я знаю перл и знаю питон. И с последним по возможности стараюсь работать в исключительных случаях. У него очень неудобный и некрасивый синтаксис, а чего-то особенного чего нет в других языках его уровня абстракции он попросту не умеет. Единственное преимущество питона это довольно шустрый интерпретатор. Но, увы, не настолько, чтобы на нём можно было писать что-то критически важное по скорости. Так что свистопляска вокруг питона мне напоминает твиттер, гуглевейв и нанотехнологии. (Чтобы не показаться пристрастным, в перле меня дико раздражает отсутствие внятного ООП как например в ruby и бессистемное безумие вместо синтаксиса (красивым автор считает синтаксис tcl - примечание автора)) С другой стороны вам никто не мешает написать статью про питон. Это было бы гораздо лучше нежели критика доживающего свой век perl5. Право я не понимаю, чего плохого в статье по тому или иному ЯП? Пусть будет. Вам видимо никогда не доводилось получать от начальства задания написать к обеду скрипт на VBS не смотря на полное незнание вами синтаксиса оного VBS'а.
kstep 17.02.2010 05:12 #
С другой стороны, чем больше языков я изучаю, тем больше убеждаюсь, что плохих и совсем некрасивых языков не бывает. Каждый язык по своему хорош и имеет свою нишу. И разные задачи проще выражаются на разных языках. Как там было, «О любви я говорю по-французски, о делах — по-немецки, о цветах — по-голландски, а матерюсь — по-русски»...
f_evgeny 17.02.2010 12:11 #
Назовите реальную альтернативу Python?
Я пользуюсь и Perl и Python, уже писал, чем не нравится Perl. Самое главное, то, что у него неудобный синтаксис передачи параметров в функцию, имею в виду массивы/словари(хэши).
Я не критикую Perl. Просто на сегодня оптимальным выбором в качестве скриптового языка считаю Python. Раньше был Perl.
Это не значит что Perl плохой. Просто некоторые вещи в Python удобнее.
Статью про Python? Думаете нужна еще одна статья? Могу написать.
Shtsh 15.02.2010 23:24 #
давно хотел чего-нибудь по перлу почитать :) Вот и появилось тут
afiskon 15.02.2010 23:46 #
Рад, что Вам понравилось. Чувствую, продолжению быть.
kstep 16.02.2010 00:08 #
Неплохая статья для начинающих, но всё равно требует некоторых базовых знаний программирования хотя бы на каком-нибудь другом языке.
ner_uto 16.02.2010 19:25 #
Наверное мое мнение будет особенно ценно, ибо я знаю пол-языка программирования:) 2 года QBasic в школе и год - в универе.

Все в общем-то понятно, хотя да, требуется хотя бы базовое знание, что такое тот же "скаляр".

И еще, можно "для блондинок" объяснить вот эту часть:

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

Но 10я строка ничем вроде бы не отличается от 8 и 5.
afiskon 16.02.2010 20:09 #
При копировании статьи из блога, нумерация строк сбилась. Посмотрите оригинал на http://eax.me/
ner_uto 16.02.2010 21:08 #
Вон оно что... спасибо.
f_evgeny 17.02.2010 12:14 #
Скаляр это ИМХО не базовое знание, это специфическое для Perl. Это базовый тип, примерно соответствует строке.