]]> ]]>
Править | Обсудить | История

Perl

Дата создания:
1987
Создан под влиянием:
Повлиял на:
Парадигма:
Типизация:
Принятые расширения файлов:
.pl, .pm
Реализации и версии (свернуть все | развернуть все):
Язык программирования

Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language «практический язык для извлечения данных и составления отчётов»

Сейчас Perl содержится практически в каждом дистрибутиве Linux и других UNIX-систем, портирован на Windows и многие другие платформы. Администраторы со всего мира используют его для автоматизации своих повседневных задач.

Репозиторий CPAN содержит множество модулей для языка буквально на все случаи жизни.

Элементы синтаксиса:

Комментарий до конца строки #
Комментарии, которые не могут быть вложенными =pod ... =cut
Регистрозависимость да
Регулярное выражение идентификатора переменной [_a-zA-Z0-9]*
Регулярное выражение идентификатора функции [_a-zA-Z][_a-zA-Z0-9]*
Присваивание значения переменной =
Объявление переменной my $variable или our $variable
Объявление переменной с присваиванием значения my $variable = value или our $variable = value
Группировка выражений ( ... )
Блок { ... }
Равенство == eq
Неравенство != ne
Сравнение < > <= >= <=> lt gt le ge cmp
Определение функции sub f (p1, p2, ...)
Вызов функции f(a, b, ...) или &f(a, b, ...) или f a, b, ...
Вызов функции без параметров f() или &f или f
Последовательность ; или ,
Если - то if (condition) ... или ... if condition или unless (condition) ... или ... unless condition
Если - то - иначе if (c1) ... elsif (c2) ... else ... или unless (c1) ... elsif (c2) ... else ...
Бесконечный цикл while(){ ... } или ... while 1
Цикл с предусловием while (condition) ... или ... while condition
Цикл с постусловием do ... until condition или do ... while condition
Цикл for - next для диапазона целых чисел с инкрементом на 1 for ($i = 1; $i < 10; $i++) ... или for my $i (1..10) ... или for (1..10) ... или ... for ( ... )
Цикл for - next для диапазона целых чисел с декрементом на 1 for ($i = 10; $i > 0; $i--) ...

IDE/Редакторы:

Примеры:

Hello, World!:

Пример для версий Perl 5.12.1, rakudo-2010.08
print "Hello, World!\n";

Hello, World!:

Пример для версий rakudo-2010.08

Команда say доступна только в Perl 6.

say 'Hello, World!';

Факториал:

Пример для версий Perl 5.12.1

Используется функция reduce из модуля List::Util. Дополнительная единица в начале списка добавлена для того, чтобы пример работал даже тогда, когда список 1..$n пуст, т.е. при $n=0.

use List::Util qw(reduce);
sub fact {
  my $n = shift;
  reduce { $a * $b } 1, 1 .. $n
}
 
foreach my $i (0..16) {
    print "$i! = ", fact($i), "\n";
}

Факториал:

Пример для версий Perl 5.12.1

Используется рекурсивное определение факториала. Не совместим с Perl 6.

sub fact {
  my $n = shift;
  $n == 0 ? 1 : $n*fact($n-1);
}

foreach my $i (0..16) {
    print "$i! = ", fact($i), "\n";
}

Факториал:

Пример для версий Perl 5.12.1

Используется итеративное определение факториала. Не совместим с Perl 6.

sub fact {
  my $n = shift;
  my $result = 1;
  foreach my $i (1 .. $n) {
    $result *= $i;
  }
  $result
}

foreach my $i (0..16) {
    print "$i! = ", fact($i), "\n";
}

Факториал:

Пример для версий rakudo-2010.08

Используется метаоператор сокращения; [*] в начале списка означает “применить эту операцию к элементам списка”. Вывод результата можно также записать как

say "$i! = &fact($i)";
sub fact($n) { [*] 1..$n }

for 0..16 -> $i {
    say "$i! = ", fact($i);
}

Числа Фибоначчи:

Пример для версий Perl 5.12.1

Используется рекурсивное определение чисел Фибоначчи.

sub fibonacci {
  my $n = shift;
  $n < 3 ? 1 : fibonacci($n-1) + fibonacci($n-2)
}
 
foreach (1..16) {
  print fibonacci($_), ", ";
}
print "..."

Квадратное уравнение:

Пример для версий Perl 5.12.1

В Perl 6 нет обратной совместимости, поэтому этот пример не работает в Perl 6.

$A = <>;
if ($A == 0) {
    print "Not a quadratic equation.";
}
else {
    $B = <>;
    $C = <>;
    $D = $B * $B - 4 * $A * $C;
    if ($D == 0) {
        print "x = ", -0.5 * $B / $A;
    }
    else {
        if ($D > 0) {
            print "x1 = ", 0.5*(-$B + sqrt($D))/$A, "\nx2 = ", 0.5*(-$B - sqrt($D))/$A
        }
        else {
            print "x1 = (", -0.5*$B/$A, ",", 0.5*sqrt(-$D)/$A, ")\nx2 = (", -0.5*$B/$A, ",", -0.5*sqrt(-$D)/$A, ")\n"
        }
    }
}

Квадратное уравнение:

Пример для версий rakudo-2010.08

Основных отличий от примера для Perl 5 два: команды чтения с консоли и вывода на печать и то, что все переменные должны быть объявлены при помощи зарезервированного слова my (объявление типа переменной остается опциональным).

my $A = $*IN.get;
if ($A == 0) {
    say "Not a quadratic equation.";
}
else {
    my $B = $*IN.get;
    my $C = $*IN.get;
    my $D = $B * $B - 4 * $A * $C;
    if ($D == 0) {
        say "x = ", -0.5 * $B / $A;
    }
    else {
        if ($D > 0) {
            say "x1 = ", 0.5*(-$B + sqrt($D))/$A, "\nx2 = ", 0.5*(-$B - sqrt($D))/$A
        }
        else {
            say "x1 = (", -0.5*$B/$A, ",", 0.5*sqrt(-$D)/$A, ")\nx2 = (", -0.5*$B/$A, ",", -0.5*sqrt(-$D)/$A, ")\n"
        }
    }
}

CamelCase:

Пример для версий Perl 5.12.1

Первая строка читает строку для обработки. Вторая — заменяет все не-буквы на пробелы; для этого используется операция замены регулярных выражений c опцией g, которая ищет все соответствия паттерну в строке. Третья строка переводит в верхний регистр первую букву каждого слова и в нижний — следующие буквы. Паттерн \b(\w+)\b соответствует максимальному одиночному слову (окруженному со всех сторон пробелами). Переменная $1 в выражении замены содержит слово, соответствующее паттерну. Выражение замены ucfirst($1) в сочетании с опцией /e заменяет слово на результат вычисления этой функции от него (/e активирует интерполяцию переменных в строке). Наконец, четвертая строка удаляет все пробелы из строки.

Во всех действиях с регулярными выражениями используется оператор привязки =~, который позволяет применять их к произвольной переменной, а не к переменной по умолчанию $_.

$A = <>;
$A =~ s/[^a-zA-Z]+/ /g;
$A =~ s/\b(\w+)\b/ucfirst($1)/ge;
$A =~ s/[ ]+//g;
print $A;

Числа Фибоначчи:

Пример для версий rakudo-2010.08

Используется рекурсивное определение чисел Фибоначчи. ~ — оператор конкатенации. $_ — переменная по умолчанию, в данном случае счетчик цикла.

sub fibonacci($n) {
  $n > 1 or return $n;
  return fibonacci($n-1) + fibonacci($n-2);
}

my $st = "";
for 1..16 {
  $st ~= fibonacci($_) ~ ", ";
}
say $st, "..."

CamelCase:

Пример для версий rakudo-2010.08

Первая строка читает строку для обработки. Вторая — объявляет строковую переменную, в которой будет формироваться результат.

В третьей строке происходит самое интересное: регулярное выражение <[a..zA..Z]>+ ищет в строке все “слова” — максимальные последовательности букв. Для каждого найденного слова выполняется встроенный в регулярное выражение код { $cc ~= $0.capitalize; }, который переводит его в нужный регистр и дописывает в результат. Наконец, результат $cc выводится на печать.

my $A = $*IN.get;
my $cc = "";
$A ~~ s:g /(<[a..zA..Z]>+) { $cc ~= $0.capitalize; } //;
print $cc;

CamelCase:

Пример для версий Perl 5.12.1

В этом примере строка разбивается на части, разделенные небуквенными символами, затем к каждой части применяется функция ucfirst, переводящая ее в нужный регистр (команда map), и, наконец, все части конкатенируются командой join.

my $text = <STDIN>;
$text = join('', map(ucfirst, split(/[^a-z]+/, lc $text)));
print $text, "\n";

CamelCase:

Пример для версий Perl 5.12.1

Этот пример работает так же, как этот, но для разбития строки на слова используется регулярное выражение, выделяющее максимальные последовательности букв

my $text = <STDIN>;
$text = join('', map(ucfirst, lc($text) =~ /[a-z]+/g));
print "$text\n";

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам