За последнюю неделю несколько раз пришлось столкнуться с Perl —помогать знакомой студентке писать скрипты на этом языке. Вспомнилась молодость 😉 когда я работал в Сбербанке (именно в то время я и познакомился с Perl’ом). Так что я решил опубликовать (с некоторыми исправлениями) свою давнюю публикацию по Perl в Fido(из тех же сбербанковских времён), дабы не потерялась.
Вобщем-то, задумка автора Perl’а неплоха: язык наследует немало фишек из утилит Unix, которые работают со строками, мнемоничен и близок к английскому (потому как Larry Wall по образованию — лингвист), позволяет писать довольно понятные конструкции вроде
open F, "< filename.txt" or die "Can't open file: $!";
или
print “Yes!” if $x > 0;
Но в то же время Perl позволяет создавать код прямо-таки в виде ребусов. Например, этот скрипт печатает «Hello world»:
#!/usr/bin/perl
$_=q$qsjou<vd<r<aia+<rr<bfmmp+<xpsme=\ob$;
y?<-@*-.b-z? -$+-/a-y?;s=\D+=$&=ee
«Красиво», правда? 😉 Скрипт — работает, можете проверить. 🙂
У новичка сразу возникает два вопроса: где строка «Hello, world», и где же вызов команды print? Попробуем разобраться…
1. Делим скрипт на «строки», получаем следующее (для удобства я их пронумеровал):
1. $_=q$qsjou<vd<r<aia+<rr<bfmmp+<xpsme=\ob$;
2. y?<-@*-.b-z? -$+-/a-y?;
3. s=\D+=$&=ee;
2. Первая строка — обычное присваивание строки в двойных кавычках (используется оператор ‘q//’, который то же, что и "", но delimiters можно выбирать такие, какие тебе удобно, в данном случае взят символ доллара):
$_ = "qsjou<vd<r<aia+<rr<bfmmp+<xpsme=\ob";
3. Вторая строка — это оператор посимвольной замены, аналог команды ‘tr’. И опять кавычки заменены, в данном случае на знак вопроса, потому что в подстановке есть символ ‘/’. В «красивом» виде имеем:
$_ =~ y[<-@*-.b-z]
[ -$+-/a-y];
Операция производится над строкой $_ и в неё же происходит присваивание. После выполнения строка $_ приобретает значение:
'print uc q aha, qq aello, world!\na'
4. Третья строка — это оператор замены ‘s///’ (в качестве delimiters выбран знак вопроса). Приведём её в более понятный вид, получим:
$_ =~ s/\D+/$&/ee;
Флаг ‘e’ — вот в чём весь фокус! Он указывает рассматривать правую часть оператора как выражение, а двойной ‘ee’ — делает это дважды, т.к. рассматривает как выражение то, что получилось после первого преобразования с помощью ‘e’. Подробнее — в документации по Perl.
Первый из этих ‘e’, выполняя полученное выражение для всех non-digit (это тот самый `\D`), заменяет в полученной строке «операторы кавычек» (qaa — это q//, то есть »; qqaa — это qq//, то есть "").
Второй ‘e’ выполняет оператор, который получился в правой части:
print uc 'h', "ello, world!\n";
uc — это функция upper-case, остальное, думаю, понятно. 🙂
Вот такая головоломка 🙂
» автомобили владивосток: новые и с пробегом;
» советы начинающим поэтам: как писать стихи;
» бесплатные объявления: подержанные автомобили — покупка и продажа «из рук в руки»