Когда-то на нем было написано множество системных скриптов в UNIX/Linux, а сейчас он ИМХО незаслуженно позабыт, и новое поколение программистов даже считает его «плохочитаемым», отдавая предпочтение более модным и современным языкам с синтаксисом еще более древнего PL/1

Хотя как он может быть непонятным и плохочитаемым, если типовая «первая программа Hello world!» выглядит буквально так:

print "Hello, world!";

Поскольку perl изначально все-таки для UNIX, то и программы для него, как правило, в типичном стиле для shell-скриптов начинаются со строчки запуска интерпретатора:

#!/usr/bin/perl

print "Hello, world!";

Для пришельцев из windows-мира, которые до сих пор не знают зачем это нужно - это позволяет просто обозначить файл как исполняемый и запускать его, как любую другую программу, не указывая дополнительно чем и как его интерпретировать - это как раз и написано в первой строчке.

В языке есть переменные, которые начинаются со знака $, точно так же как в sh, bash или PHP, например. Это на самом деле довольно удобно, сразу понимаешь, где переменная.

my $a = 2;
my $b = 3;
my $c = $a * $b;
print "$c\n";

Ключевое слово my обьявляет переменную в рамках области видимости. В данном случае область видимости - весь скрипт с момента обьявления переменной, но если ограничить ее скобками { ... } - то видимость тоже будет ограничена.

# комментарий

my $a = 1;
{
  my $a = 8;
  print "$a\n"; # результат 8
}
print "$a\n";   # результат 1

Всякие циклы как в С:

for( my $i = 0 ; $i < 10 ; $i++ ){
  print "$i ";
}

# "0 1 2 3 4 5 6 7 8 9 "

Есть дополнительные штуки типа foreach и elsif:

my @array = [0,1,2,3,23,44,23,23453,5];

foreach my $item (@array){
  if ($item < 2) {
    print "Less than 2\n";
  }
  elsif ($item < 10){
    print "Less than 10 but greater than 2\n";
  }
  else {
    print "hz...\n";
  }
}

(а кого бесят скобки - вспоминайте про область видимости, иногда очень удобно ограничить ее для одних, локальных переменных, при этом пользуясь другими, общими, объявленными выше)

Есть множество встроенных функций, man perlfunc, и можно писать свои:

sub my_func {
  my ($arg1, $arg2, $arg3) = @_;

  print "$arg1 * $arg2 = $arg3!\n";
  my $x = $arg1 * $arg2;
  print "На самом деле нет: $x\n";
}

my_func(32768, 100500, "Неисчислимое количество");

# "32768 * 100500 = Неисчислимое количество!"
# "На самом деле нет: 3293184000"

Есть подключаемые библиотеки, которые позволяют делать почти всё что угодно, если кто-то удосужился соответствующую библиотеку написать:

use pQuery;

my $page = pQuery("http://google.com/");
my $title = $page->find('title');
print "The title is: ", $title->html;

Ну и конечно, регулярные выражения:

my $a = "Мама мыла раму";
if( $a =~ /^(Мама)\s(мыла .*)$/){
  my $who = $1;
  my $do  = $2;

  $do =~ s/мы/пи/;
  $do =~ s/аму/ом/;
  print "$who $do\n";
}

В общем, полноценный язык программирования, на котором можно писать как простые системные скрипты, так и сложные веб-системы.

Другой вопрос, что он очень гибкий и пофигистичный, и то же самое можно написать примерно вот так:

my$a="Мама мыла раму";if($a=~/^(Мама)\s(мыла .*)$/){$a=$1;my$x=$2;$x=~s/мы/пи/;$x=~s/аму/ом/;print"$a $x\n";}

и оно всё еще будет работать, но вот поддерживать потом такой "скрипт" - да легче новый язык программирования придумать!
И это мы еще не углублялись в загадочный мир встроеных переменных типа $_,@_,$!,$|,$<,...
В общем, никто за программиста не подумает, кроме самого программиста.

Но - как сейчас говорят, "он давно не развивается". Отдельные попытки где-то что-то поломать не в счет, работает он так же как и 10 лет назад, а по нынешним меркам это всё равно что умер.
Удивительно, как до сих пор не начали алфавит развивать, добавляя в него новые буквы и цифры (хотя вот смайлики добавили, да).

Комментарии (38)


  1. bungu
    09.01.2025 15:12

    незаслуженно позабыт

    Забыт он только среди javascript-макак (которые о нем возможно вообще не знали). А в реальности у Perl есть свое комьюнити и свой рынок труда


    1. JBFW Автор
      09.01.2025 15:12

      А тут как с PHP:
      1 - студенты: мы учили PHP, на нем можно писать сайты!
      2 - студенты: мы пишем "сайты на PHP", обращайтесь к нам!
      3 - менеджер: хм, нашей конторе нужен сайт, "сайт на PHP" (хз что это такое, наверное то что надо)
      4 - менеджер: ищем исполнителей, нам нужен сат на PHP?
      5 - веб-контора: а на RoR пойдет? На J2EE? На Perl?
      6 - менеджер: нам нужен сайт на PHP! Можете на Perl такой сделать?
      7 - веб-контора: ок, вот ваш "сайт на PHP", на Perl, устроит? (pokerface)
      8 - менеджер: да, то что надо! У нас теперь есть свой "сайт на PHP"!


    1. anoneko
      09.01.2025 15:12

      Сам-то на ассемблере кодишь поди, как труъ?


  1. Mox
    09.01.2025 15:12

    Забыт он скорее ради Ruby и Python и возвращаться на perl совсем не хочется. Закопать стюардессу.


    1. JBFW Автор
      09.01.2025 15:12

      Много-много лет назад на вопрос "на чем лучше делать сайты?" Гуру ответил: на Ruby on Rails!

      Прошли годы. Попадалось вживую множество сайтов на Perl CGI, на Perl не CGI, на PHP, на Java, на Python, на NodeJS, даже на .NET - но ни разу не попался на Ruby on Rails
      Как-то так само получилось...


      1. Mox
        09.01.2025 15:12

        Последний Perl CGI мне попадался в 2004, а Ruby On Rails мне попался на глаза только в 2007.

        А так то дофига сайтов - github, airbnb, shopify в голову приходят


        Из наших кого помню - Рокетбанк, Кухня на районе.


        1. JBFW Автор
          09.01.2025 15:12

          Вот, и у вас тоже Perl CGI )
          CGI это отдельная технология, просто в то время других скриптовых языков в общем-то и не было: sh, tcl да perl. Ну еще бинарники на C/C++.
          Устарела давным-давно, хотя применение и ей найти можно. Но она - не Perl.

          Мне про Ruby намного раньше говорили, в общем-то расхваливали - но как-то не сложилось, а потом не надо было, и случайно уже не попадалась.
          В общем верю что хорошая - но забИтая PHP-шниками, как наиболее массовым явлением.


  1. YegorP
    09.01.2025 15:12

    Вся заметка выглядит как тоска по самому обычному языку программирования. Так чего там особенного-то было? В цифровом мире "просто работает" и "не ломается" десятилетями что угодно кроме железа и YY вместо YYYY.

    Удивительно, как до сих пор не начали алфавит развивать

    На русскомъ ли языкѣ заикаться о таковомъ?


    1. JBFW Автор
      09.01.2025 15:12

      Удобство. Он легкий, простой, быстрый, напоминает одновременно С и JS.
      Из недостатков разве что специфическая работа с UTF8 и в некоторых случаях особенности нецелочисленной арифметики, можно получить значения типа 3.00000000000000001 вместо 3.00

      А алфабет текущий не менялся уже лет сто. Ну, если не считать редуцирование буквы ё, которая тем не менее пока сохраняется.


      1. YegorP
        09.01.2025 15:12

        Ок, погнали.

        простой

        Я пошёл на https://www.perl.org/get.html и сразу же мне надо знать чем Strawberry Perl отличается от ActiveState Perl. Напоминает Python 2 vs Python 3.

        легкий

        Я нажал Strawberry Perl и увидел следующее:

        5.40.0.1 MSI (196.4 MB)
        5.40.0.1 Portable zip (285.5 MB)
        5.40.0.1 PDL zip (335.0 MB)

        Для сравнения: Node.js - 30 МБ, PHP - 30 МБ

        специфическая работа с UTF8

        То есть вѣковыя русскія буковки не подъхватитъ?

        можно получить значения типа 3.00000000000000001 вместо 3.00

        А это разве касается конкретно Perl?


        1. JBFW Автор
          09.01.2025 15:12

          1 - это UNIX/Linux вещь, не Windows )
          Под Windows есть порты разной степени проработанности, но это мягко говоря не совсем то.
          Если у вас Windows - проходим мимо сразу, лучше не мучаться, там даже форков нет.

          2 - в "комплект" обычно входит некоторый набор библиотек, и в общем случае он может быть очень разным, от минимального, где собственно интерпретатор + утилита установки библиотек до такого, куда поназапихано всё что счел нужным запихать автор дистрибутива.
          А софта там мнооого.

          3 - буковки русския подхватывает, но внутренняя кодировка UTF8 у него своя, и чтобы понимал он их так же как стандартные - их нужно в эту кодировку конвертировать, а потом из этой кодировки выконвертировать обратно.
          Но к счастью это нужно далеко не всегда, в большинстве случаев ему пофиг что там за двухбайтицы такие, оно просто с двухбайтицами работает.

          4 - это недостаток. Недостаток же? Ну, неспецифический, но есть.


          1. YegorP
            09.01.2025 15:12

            1 - 3 недостатки, а вот 4 вполне ожидаемое стандартное поведение.

            0.1 + 0.2 в любом мейнстримном ЯП общего назначения выдаст 0.30000000000000004. Программистам это лучше бы знать. Вместе с ±0, NaN'ами и Inf'ами.


            1. verls
              09.01.2025 15:12

              #!/usr/bin/env perl
              
              use v5.34;
              use strict;
              use warnings;
              
              
              use Math::BigFloat;
              
              my $a = Math::BigFloat->new('0.1');
              my $b = Math::BigFloat->new('0.2');
              my $sum = $a + $b;
              
              say "Sum: a + b = $a + $b = $sum";
              

              Выдало:
              Sum: a + b = 0.1 + 0.2 = 0.3


        1. verls
          09.01.2025 15:12

          1. ActiveState сборка от компании, Strawberry свободная реализация

          2. Здесь сборки образа докера до 50Мб https://www.reddit.com/r/perl/comments/sd5403/tiniest_perl_docker_image/?rdt=56900 Можно из исходников собрать то, что тебе нужно.

          3. В Perl одна из первых и наилучших поддержек unicode. use utf8; + binmode


    1. a-tk
      09.01.2025 15:12

      Из особенного - если есть массив @x, то $x - его длина. Или если %x - это хэш-таблица, то $x - её длина.


      1. JBFW Автор
        09.01.2025 15:12

        Это не совсем правильно, точнее совсем неправильно )

        # это скалярное значение
        my $x = 1; # или "1", или "корова", или ссылка на массив или хеш.
        
        # это массив, он сам по себе, к $x не относится никак.
        my @x = ( 23, "да" );
        
        # это хеш, он тоже сам по себе, к $x не относится никак
        my %x = ( name => 'товар', price => 123.43 );
        
        # а вот это длина массива или хеша
        $x = @x; # или = %x, или = scalar @x;
        # просто она присвоена переменной $x
        


        1. checkpoint
          09.01.2025 15:12

          Я бы сформулировал это так: присваивание нескалярной переменной к скаляру возвращает её длину.


  1. uuger
    09.01.2025 15:12

    Повеяло воспоминаниями об обновлении каталогов cgi-bin через ftp клиента FAR manager


    1. JBFW Автор
      09.01.2025 15:12

      Вот об этом я и говорю!
      Запомненные ассоциации, типа "Perl это CGI" - то же самое что Far это CGI - реальности не соответствует, но на то они и ассоциации.


  1. e_u_g
    09.01.2025 15:12

    Ага. А в универе, в 90е была курсовая: Написать консольного email клиента на awk, под SunOs. Как уже сказано выше - закопайте стюардессу


    1. JBFW Автор
      09.01.2025 15:12

      Если бы вы получали телеметрию от древней железяки по email, и вам потребовалось бы интегрировать ее в какую-то систему мониторинга - возможно, консольный awk по крону оказался бы вам очень кстати.
      И намного более кстати, чем ждать, пока производитель новой системы мониторинга раздуплится написать для вас обновление, поддерживающее эту древнюю железку.

      Хотя почему древнюю? Это почти та же задача, которую пришлось не очень давно решать, забирая с email-сервера фотографию, снятую камерами наблюдения, для отправки на обработку в AI на предмет подсчета количества человек.
      Просто я awk не настолько хорошо знаю, оказалось проще написать на perl перехватывающий smtp-сервер...


      1. e_u_g
        09.01.2025 15:12

        Кажется, я не сумел донести мысль. Попробую развернуть.

        Компьютерные технологии - это кладбище блестящих инженерных и научных идей и решений. И нет смысла их реанимировать. Нужно признать - они мертвы.

        Да, в своё время perl, COM+, prolog и т.д. были в фаворе. Но нет технической причины их вытаскивать и как-то пытаться возбудить к ним интерес. Та же функциональность достигается сегодня иными средствами. И да, вполне вероятно, и эти средства через год/два/пять устареют и также исчезнут.

        Каждый из нас несёт персональный груз подобных мёртвых знаний и навыков. Ваше воспоминание perl отрекошетило мне awk-ом. А ведь мог бы и коды калькулятора МК-56 припомнить :-)


        1. JBFW Автор
          09.01.2025 15:12

          Да никто не пытается "возбудить интерес" )
          Я не продаю ни курсы, ни книги.

          Есть работающая штуковина - я об этом говорю. Это инструмент.
          Есть задачи, решаемые. Вот понадобилось решить с теми же фотографиями - беру инструмент и решаю. Наверное, кто-то решил бы используя python (awk - вряд ли тут подойдет).
          Кто-то напишет на С. Кто-то решит, заменив видеокамеры. Кто-то "обратится к специалистам, они сделают".

          А есть подход "эта лопата старая, поэтому ей копать я не буду, а буду копать новым смартфоном, он тонкий, легкий и современный!".


        1. karmael
          09.01.2025 15:12

          экий вы торопыга.

          ну вот ей богу, если в вашей жизни не существует awk то с вероятностью чуть более 99%, вы не инженер, не админ, и в целом от железно-аппаратных проблем держитесь на расстоянии абстракций, делая громкие заявления о мёртвости того, что у вас и живым то никогда и не было.

          awk, bash, grep и их весёлые комбинации всё так же сопровождают по жизни системных инженеров и системных администраторов. Потому, что вот то что вы держите на расстоянии абстракций, не то что бы графического иного кроме консоли интерфейса не имеет, а нужно получать метрики, софты настраивать, за вами прибирать, громкими пограмистами.

          вот эта тяга неуёмная к трэндам и кейсам, живет решительно в какой то своей параллельной вселенной полной комиксов и соевых новостей, про модные фреймворки опережающие своё время.


          1. checkpoint
            09.01.2025 15:12

            Я таких называю "смузихлёбы". Весь софтовый мир держится на людях программирующих на C и C++, знающих ассемблер и способных дебажить в gdb до талова ночи на пролёт. Как только последний сишник уйдет на пенсию, весь их чудесный облачный мир красивых и разнообразных фреймворков накроется п$#%ой.


        1. Kahelman
          09.01.2025 15:12

          Вообще-то на awk и сей час писать Парсинг всяких логов и прочих текстовых файлов одно удовольствие. Работает везде даже под виндой. Проблем с обратной совместимостью нет. Да и скорость приличная- поскольку писали люди знающие а не скрипт кидс


    1. pawnhearts
      09.01.2025 15:12

      Хм? awk постоянно использую в скриптах. Solaris был на работе когда-то, но и сейчас несмотря на все старания oracle его погубить есть масса применений, СХД всякие с ZFS(хотя даже nexenta вроде загнулась). Там отличная контейнеризация давно и можно было делать контейнеры и с линуксом, dtrace, SMF.


    1. verls
      09.01.2025 15:12

      У вас байты сыреют и осыпаются от старости? Давайте закопаем тогда арифметику с их 2+2 =4 - ведь ей уже 2,5 тыс лет!


  1. aeder
    09.01.2025 15:12

    Вот именно то, что perl не меняется десятилетиями и при этом есть везде - и подкупает.

    Да, изначальный синтаксис придумывали люди с более высоким IQ, чем у нынешних поколений - потому что это была эпоха, когда программист не мог назвать себя программистом, если не умел хоть немного писать в машинных кодах.

    Но ведь не обязательно держать в голове все умолчания и сокращения, можно писать подробно.


    1. arheops
      09.01.2025 15:12

      Уже не везде. в полследних rhel его нету, к примеру.

      Перешли на питон. И честно говоря приимуществ перед питоном у перла немного.


  1. pawnhearts
    09.01.2025 15:12

    Ну так-то там неплохие фреймворки были для всего времени типа Catalyst. Если придерживаться принятого в тем стиля, а не https://ru.wikipedia.org/wiki/JAPH то можно было писать неплохой поддерживаемый кот. Вообще буквально пару лет назад работал в конторе где мы переписывали их код с perl на python, но, скорее потому что найти программиста на perl сейчас сложно.

    Вообще raku очень прикольная штука вышла, там можно переопределять вообще всё и лепить всякие dsl, но уже не взлетит.


    1. JBFW Автор
      09.01.2025 15:12

      Catalyst тяжеловатый, Mojolicious вроде получше.


  1. c0r3dump
    09.01.2025 15:12

    Perl был первым языком на котором я начал писать, но сейчас нет никакого желания писать на нем и уж тем более читать чужой perl-код. А ЖЖ вроде был на перле изначально, интересно это до сих пор так, хотя бы от части?


    1. JBFW Автор
      09.01.2025 15:12

      Если нашли человека на Perl на их условия...


  1. checkpoint
    09.01.2025 15:12

    Продолжаю использовать Perl5 для всяческой автоматизации, расчетов и конвертирования блоков данных. Хэши и pack/unpack - наше всё. Также мне очень нравится репозиторий библиотечных модулей с готовыми примерчиками и документацией - наливай да пей.

    Сильно сожалею, что в борьбе за место под солнцем выиграл тормозной Python со своим уродским синтаксисом и кучей проблем совместимости между разными версиями. Только что наткнулся на неизвестную мне ранее конструкцию ": str | None = None" ипользуемую в стороннем приложении, которую ввели в Python 3.10, а у меня 3.9. Ставить еще один комплект питона в добавок к пяти уже установленным жутко напрягает. Хочется поубивать и тех, кто постоянно выдумывает новый синтаксиc, и тех, кто норовит запихнуть его во все места.


    1. arheops
      09.01.2025 15:12

      Хорошая конструкция, кстати.

      Когда у вас 5-10 параметров со сложными типами очень помогает.

      Мы из за нее пайплайн апгрейднули до 3.10

      То, что в мелких скриптах она вам не нужна - не значит, что другим не нужна.


      1. checkpoint
        09.01.2025 15:12

        То, что в мелких скриптах она вам не нужна - не значит, что другим не нужна.

        Но как-то же вы обходились без неё много лет ? Какой принципиально новый функционал эта фичка позволила вам внерить ? Заказчик доволен ? С колько кода пришлось переписать и времени на это потратить ? А сколько ждет чудесных моментов людей которые придут на Ваше место и наткнутся на этот код ?


        1. arheops
          09.01.2025 15:12

          Одно изменение ничего не влияет. Но сумма - да. А перл не развивается.

          Главное, что команда довольна ;) Принципиально - обьявление функции стало не три строчки, и одну. Когда их дофига это сильно упрощает чтение кода.

          Код переписывать не пришлось.

          Если на мое место прийдут люди, не интересующиеся языком - гугл и чатгпт всегда помогут.

          В частности в вашем примере правильно было написать Optional[str].