]]> ]]>

Perl

Реализация языка программирования Perl

Базовая реализация языка Perl, написанная на C.

Примеры:

Hello, World!:

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

Факториал:

Пример для версий 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";
}

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

Пример для версий 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"
        }
    }
}

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

Первая строка читает строку для обработки. Вторая — заменяет все не-буквы на пробелы; для этого используется операция замены регулярных выражений 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;

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

]]>

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