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

79b0bd58d5fa8f57b06f2bde080f465d.png

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

© Habrahabr.ru