Поиск по этому блогу

среда, 20 августа 2014 г.

Perl feature

feature (особенность) - Perl прагма для включения нового функционала. Детальное описание feature можно найти в perldoc, а тут приведу лишь некий краткий анонс.

В общем случае feature в perl-коде включаются следующим образом:
 use feature qw(say switch);
given ($foo) {
    when (1)          { say "\$foo == 1" }
    when ([2,3])      { say "\$foo == 2 || \$foo == 3" }
    when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
    when ($_ > 100)   { say "\$foo > 100" }
    default           { say "None of the above" }
}
use feature ':5.10'; # загружает все feature доступные в perl 5.10
use v5.10;           # неявно загружает :5.10 feature
Как правило невозможно добавит в perl-скрипт новый синтаксис, не нарушая существующий код. Использование feature даёт возможность минимизировать этот риск. Новые синтаксические конструкции могут быть включены лишь в часть кода и будут разбираться лишь тогда когда соответствующая прагма находится в области видимости. Тем не менее использование префикса CORE::префикса позволяет использовать все новые ключевые слова Perl, независимо от использование директивы feature. Например:
use feature "say";
say "test0";
или
CORE::say "test0";

no feature - отключает действие feature:
use feature 'say';
say "say is available here";
{
    no feature 'say';
    print "But not here.\n";
}
say "Yet it is here.";

use feature 'say' - включает использование Perl6 функции say.
Функция say аналогична print, но к выводу добавляет "\n".
Эта feature доступна с версии Perl 5.10.

use feature 'state' - сообщает компилятору о включении переменных состояния (state).
Для детального ознакомления изучаем Persistent Private Variables.
Эта feature доступна с версии Perl 5.10.
use feature 'state';
sub gimme_another { state $x; return ++$x }
Пример с использованием анонимной функции:
use feature 'state';
sub create_counter {
    return sub { state $x; return ++$x }
}

use feature 'unicode_strings' - сообщает компилятору использовать правила Unicode во всех строковых операциях, попадающих в сферу его действия feature. Это же относится и к регулярным выражениям. При этом внутреннее представление не изменяется, меняется лишь их интерпретация.
Рекомендуется изучить Perl Unicode Bug во избежание сюрпризов и недоразумений.
Эта функция доступна начиная с Perl 5.12; была почти полностью реализована в Perl 5.14; и продлена в Perl 5.16, чтобы перекрыть quotemeta.

use feature 'fc' - говорит компилятору включить поддержку функции fc.
fc EXPR - возвращает регистронезависимую версию EXPR.
lc($this) eq lc($that)    # Wrong!
    # или
uc($this) eq uc($that)    # Also wrong!
    # или
$this =~ /^\Q$that\E\z/i  # Right!
Теперь можно писать так
fc($this) eq fc($that)

Комплектное включение feature
  Комплект  Включенные особенности
  --------- -----------------
  :default  array_base
  :5.10     say state switch array_base
  :5.12     say state switch unicode_strings array_base
  :5.14     say state switch unicode_strings array_base
  :5.16     say state switch unicode_strings
            unicode_eval evalbytes current_sub fc
  :5.18     say state switch unicode_strings
            unicode_eval evalbytes current_sub fc
  :5.20     say state switch unicode_strings
            unicode_eval evalbytes current_sub fc
Включение подверсии в feature не оказывает никакого эффекта. Например
use feature ":5.14.0";    # тоже, что и ":5.14"
use feature ":5.14.1";    # тоже, что и ":5.14"

Неявная загрузка feature.
Вместо загрузки отдельных feature можно позволить Perl неявно загрузить всё самому.
Для "однострочников" можно вместо -e использовать -E.
В скриптах - указать минимально используемую версию Perl. То есть:
use v5.10.0;
неявно сделает:
no feature ':all';
use feature ':5.10';