Когда-то на нем было написано множество системных скриптов в 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)
Mox
09.01.2025 15:12Забыт он скорее ради Ruby и Python и возвращаться на perl совсем не хочется. Закопать стюардессу.
JBFW Автор
09.01.2025 15:12Много-много лет назад на вопрос "на чем лучше делать сайты?" Гуру ответил: на Ruby on Rails!
Прошли годы. Попадалось вживую множество сайтов на Perl CGI, на Perl не CGI, на PHP, на Java, на Python, на NodeJS, даже на .NET - но ни разу не попался на Ruby on Rails
Как-то так само получилось...Mox
09.01.2025 15:12Последний Perl CGI мне попадался в 2004, а Ruby On Rails мне попался на глаза только в 2007.
А так то дофига сайтов - github, airbnb, shopify в голову приходят
Из наших кого помню - Рокетбанк, Кухня на районе.JBFW Автор
09.01.2025 15:12Вот, и у вас тоже Perl CGI )
CGI это отдельная технология, просто в то время других скриптовых языков в общем-то и не было: sh, tcl да perl. Ну еще бинарники на C/C++.
Устарела давным-давно, хотя применение и ей найти можно. Но она - не Perl.Мне про Ruby намного раньше говорили, в общем-то расхваливали - но как-то не сложилось, а потом не надо было, и случайно уже не попадалась.
В общем верю что хорошая - но забИтая PHP-шниками, как наиболее массовым явлением.
YegorP
09.01.2025 15:12Вся заметка выглядит как тоска по самому обычному языку программирования. Так чего там особенного-то было? В цифровом мире "просто работает" и "не ломается" десятилетями что угодно кроме железа и YY вместо YYYY.
Удивительно, как до сих пор не начали алфавит развивать
На русскомъ ли языкѣ заикаться о таковомъ?
JBFW Автор
09.01.2025 15:12Удобство. Он легкий, простой, быстрый, напоминает одновременно С и JS.
Из недостатков разве что специфическая работа с UTF8 и в некоторых случаях особенности нецелочисленной арифметики, можно получить значения типа 3.00000000000000001 вместо 3.00А алфабет текущий не менялся уже лет сто. Ну, если не считать редуцирование буквы ё, которая тем не менее пока сохраняется.
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?
JBFW Автор
09.01.2025 15:121 - это UNIX/Linux вещь, не Windows )
Под Windows есть порты разной степени проработанности, но это мягко говоря не совсем то.
Если у вас Windows - проходим мимо сразу, лучше не мучаться, там даже форков нет.2 - в "комплект" обычно входит некоторый набор библиотек, и в общем случае он может быть очень разным, от минимального, где собственно интерпретатор + утилита установки библиотек до такого, куда поназапихано всё что счел нужным запихать автор дистрибутива.
А софта там мнооого.3 - буковки русския подхватывает, но внутренняя кодировка UTF8 у него своя, и чтобы понимал он их так же как стандартные - их нужно в эту кодировку конвертировать, а потом из этой кодировки выконвертировать обратно.
Но к счастью это нужно далеко не всегда, в большинстве случаев ему пофиг что там за двухбайтицы такие, оно просто с двухбайтицами работает.4 - это недостаток. Недостаток же? Ну, неспецифический, но есть.
YegorP
09.01.2025 15:121 - 3 недостатки, а вот 4 вполне ожидаемое стандартное поведение.
0.1 + 0.2 в любом мейнстримном ЯП общего назначения выдаст 0.30000000000000004. Программистам это лучше бы знать. Вместе с ±0, NaN'ами и Inf'ами.
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
verls
09.01.2025 15:12ActiveState сборка от компании, Strawberry свободная реализация
Здесь сборки образа докера до 50Мб https://www.reddit.com/r/perl/comments/sd5403/tiniest_perl_docker_image/?rdt=56900 Можно из исходников собрать то, что тебе нужно.
В Perl одна из первых и наилучших поддержек unicode.
use utf8;
+binmode
a-tk
09.01.2025 15:12Из особенного - если есть массив @x, то $x - его длина. Или если %x - это хэш-таблица, то $x - её длина.
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
checkpoint
09.01.2025 15:12Я бы сформулировал это так: присваивание нескалярной переменной к скаляру возвращает её длину.
e_u_g
09.01.2025 15:12Ага. А в универе, в 90е была курсовая: Написать консольного email клиента на awk, под SunOs. Как уже сказано выше - закопайте стюардессу
JBFW Автор
09.01.2025 15:12Если бы вы получали телеметрию от древней железяки по email, и вам потребовалось бы интегрировать ее в какую-то систему мониторинга - возможно, консольный awk по крону оказался бы вам очень кстати.
И намного более кстати, чем ждать, пока производитель новой системы мониторинга раздуплится написать для вас обновление, поддерживающее эту древнюю железку.Хотя почему древнюю? Это почти та же задача, которую пришлось не очень давно решать, забирая с email-сервера фотографию, снятую камерами наблюдения, для отправки на обработку в AI на предмет подсчета количества человек.
Просто я awk не настолько хорошо знаю, оказалось проще написать на perl перехватывающий smtp-сервер...e_u_g
09.01.2025 15:12Кажется, я не сумел донести мысль. Попробую развернуть.
Компьютерные технологии - это кладбище блестящих инженерных и научных идей и решений. И нет смысла их реанимировать. Нужно признать - они мертвы.
Да, в своё время perl, COM+, prolog и т.д. были в фаворе. Но нет технической причины их вытаскивать и как-то пытаться возбудить к ним интерес. Та же функциональность достигается сегодня иными средствами. И да, вполне вероятно, и эти средства через год/два/пять устареют и также исчезнут.
Каждый из нас несёт персональный груз подобных мёртвых знаний и навыков. Ваше воспоминание perl отрекошетило мне awk-ом. А ведь мог бы и коды калькулятора МК-56 припомнить :-)
JBFW Автор
09.01.2025 15:12Да никто не пытается "возбудить интерес" )
Я не продаю ни курсы, ни книги.Есть работающая штуковина - я об этом говорю. Это инструмент.
Есть задачи, решаемые. Вот понадобилось решить с теми же фотографиями - беру инструмент и решаю. Наверное, кто-то решил бы используя python (awk - вряд ли тут подойдет).
Кто-то напишет на С. Кто-то решит, заменив видеокамеры. Кто-то "обратится к специалистам, они сделают".А есть подход "эта лопата старая, поэтому ей копать я не буду, а буду копать новым смартфоном, он тонкий, легкий и современный!".
karmael
09.01.2025 15:12экий вы торопыга.
ну вот ей богу, если в вашей жизни не существует awk то с вероятностью чуть более 99%, вы не инженер, не админ, и в целом от железно-аппаратных проблем держитесь на расстоянии абстракций, делая громкие заявления о мёртвости того, что у вас и живым то никогда и не было.
awk, bash, grep и их весёлые комбинации всё так же сопровождают по жизни системных инженеров и системных администраторов. Потому, что вот то что вы держите на расстоянии абстракций, не то что бы графического иного кроме консоли интерфейса не имеет, а нужно получать метрики, софты настраивать, за вами прибирать, громкими пограмистами.
вот эта тяга неуёмная к трэндам и кейсам, живет решительно в какой то своей параллельной вселенной полной комиксов и соевых новостей, про модные фреймворки опережающие своё время.
checkpoint
09.01.2025 15:12Я таких называю "смузихлёбы". Весь софтовый мир держится на людях программирующих на C и C++, знающих ассемблер и способных дебажить в gdb до талова ночи на пролёт. Как только последний сишник уйдет на пенсию, весь их чудесный облачный мир красивых и разнообразных фреймворков накроется п$#%ой.
Kahelman
09.01.2025 15:12Вообще-то на awk и сей час писать Парсинг всяких логов и прочих текстовых файлов одно удовольствие. Работает везде даже под виндой. Проблем с обратной совместимостью нет. Да и скорость приличная- поскольку писали люди знающие а не скрипт кидс
pawnhearts
09.01.2025 15:12Хм? awk постоянно использую в скриптах. Solaris был на работе когда-то, но и сейчас несмотря на все старания oracle его погубить есть масса применений, СХД всякие с ZFS(хотя даже nexenta вроде загнулась). Там отличная контейнеризация давно и можно было делать контейнеры и с линуксом, dtrace, SMF.
verls
09.01.2025 15:12У вас байты сыреют и осыпаются от старости? Давайте закопаем тогда арифметику с их
2+2 =4
- ведь ей уже 2,5 тыс лет!
aeder
09.01.2025 15:12Вот именно то, что perl не меняется десятилетиями и при этом есть везде - и подкупает.
Да, изначальный синтаксис придумывали люди с более высоким IQ, чем у нынешних поколений - потому что это была эпоха, когда программист не мог назвать себя программистом, если не умел хоть немного писать в машинных кодах.
Но ведь не обязательно держать в голове все умолчания и сокращения, можно писать подробно.
arheops
09.01.2025 15:12Уже не везде. в полследних rhel его нету, к примеру.
Перешли на питон. И честно говоря приимуществ перед питоном у перла немного.
pawnhearts
09.01.2025 15:12Ну так-то там неплохие фреймворки были для всего времени типа Catalyst. Если придерживаться принятого в тем стиля, а не https://ru.wikipedia.org/wiki/JAPH то можно было писать неплохой поддерживаемый кот. Вообще буквально пару лет назад работал в конторе где мы переписывали их код с perl на python, но, скорее потому что найти программиста на perl сейчас сложно.
Вообще raku очень прикольная штука вышла, там можно переопределять вообще всё и лепить всякие dsl, но уже не взлетит.
c0r3dump
09.01.2025 15:12Perl был первым языком на котором я начал писать, но сейчас нет никакого желания писать на нем и уж тем более читать чужой perl-код. А ЖЖ вроде был на перле изначально, интересно это до сих пор так, хотя бы от части?
checkpoint
09.01.2025 15:12Продолжаю использовать Perl5 для всяческой автоматизации, расчетов и конвертирования блоков данных. Хэши и pack/unpack - наше всё. Также мне очень нравится репозиторий библиотечных модулей с готовыми примерчиками и документацией - наливай да пей.
Сильно сожалею, что в борьбе за место под солнцем выиграл тормозной Python со своим уродским синтаксисом и кучей проблем совместимости между разными версиями. Только что наткнулся на неизвестную мне ранее конструкцию ": str | None = None" ипользуемую в стороннем приложении, которую ввели в Python 3.10, а у меня 3.9. Ставить еще один комплект питона в добавок к пяти уже установленным жутко напрягает. Хочется поубивать и тех, кто постоянно выдумывает новый синтаксиc, и тех, кто норовит запихнуть его во все места.
arheops
09.01.2025 15:12Хорошая конструкция, кстати.
Когда у вас 5-10 параметров со сложными типами очень помогает.
Мы из за нее пайплайн апгрейднули до 3.10
То, что в мелких скриптах она вам не нужна - не значит, что другим не нужна.
checkpoint
09.01.2025 15:12То, что в мелких скриптах она вам не нужна - не значит, что другим не нужна.
Но как-то же вы обходились без неё много лет ? Какой принципиально новый функционал эта фичка позволила вам внерить ? Заказчик доволен ? С колько кода пришлось переписать и времени на это потратить ? А сколько ждет чудесных моментов людей которые придут на Ваше место и наткнутся на этот код ?
arheops
09.01.2025 15:12Одно изменение ничего не влияет. Но сумма - да. А перл не развивается.
Главное, что команда довольна ;) Принципиально - обьявление функции стало не три строчки, и одну. Когда их дофига это сильно упрощает чтение кода.
Код переписывать не пришлось.
Если на мое место прийдут люди, не интересующиеся языком - гугл и чатгпт всегда помогут.
В частности в вашем примере правильно было написать Optional[str].
bungu
Забыт он только среди javascript-макак (которые о нем возможно вообще не знали). А в реальности у Perl есть свое комьюнити и свой рынок труда
JBFW Автор
А тут как с PHP:
1 - студенты: мы учили PHP, на нем можно писать сайты!
2 - студенты: мы пишем "сайты на PHP", обращайтесь к нам!
3 - менеджер: хм, нашей конторе нужен сайт, "сайт на PHP" (хз что это такое, наверное то что надо)
4 - менеджер: ищем исполнителей, нам нужен сат на PHP?
5 - веб-контора: а на RoR пойдет? На J2EE? На Perl?
6 - менеджер: нам нужен сайт на PHP! Можете на Perl такой сделать?
7 - веб-контора: ок, вот ваш "сайт на PHP", на Perl, устроит? (pokerface)
8 - менеджер: да, то что надо! У нас теперь есть свой "сайт на PHP"!
anoneko
Сам-то на ассемблере кодишь поди, как труъ?