Забытые технологии: Perl

от автора

Когда-то на нем было написано множество системных скриптов в 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 лет назад, а по нынешним меркам это всё равно что умер.
Удивительно, как до сих пор не начали алфавит развивать, добавляя в него новые буквы и цифры (хотя вот смайлики добавили, да).


ссылка на оригинал статьи https://habr.com/ru/articles/872540/