Язык Perl, простой и понятный

За последнюю неделю несколько раз пришлось столкнуться с 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, остальное, думаю, понятно. 🙂

Вот такая головоломка 🙂

Немного рекламы:
» автомобили владивосток: новые и с пробегом;
» советы начинающим поэтам: как писать стихи;
» бесплатные объявления: подержанные автомобили — покупка и продажа «из рук в руки»
Желаете отблагодарить автора? Есть несколько возможностей! :-)
Яндекс.Деньги:   PayPal:
Прочие варианты:
  • Купить подарочный сертификат Amazon и послать его на e-mail aleksey@trufanov.com
  • Перевод WebMoney WMZ на счёт Z102288667626
  • Перевод Яндекс Деньги на счёт 41001351592123


2 комментария на “Язык Perl, простой и понятный”

  1. Саша Says:

    Кстати не только Perl позволяет делать такие вещи. Вот obfuscated python.

  2. BlackBird Says:

    Саша, дааа, красиво :-))