Spec-Zone.ru › Perl 5.32

Функция

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • Свойства области видимости
    • отсутствующая функция
  • ДОСТУПНЫЕ ФУНКЦИИ
    • Функция 'say'
    • Функция 'state'
    • Функция 'switch'
    • Функция 'unicode_strings'
    • Функции 'unicode_eval' и 'evalbytes'
    • Функция 'current_sub'
    • Функция 'array_base'
    • Функция 'fc'
    • Функция 'lexical_subs'
    • Функции 'postderef' и 'postderef_qq'
    • Функция 'signatures'
    • Функция 'refaliasing'
    • Функция 'bitwise'
    • Функция 'declared_refs'
    • Функция 'isa'
    • Функция 'indirect'
  • ПАКЕТЫ ФУНКЦИЙ
  • НЕЯВНАЯ ЗАГРУЗКА

НАЗВАНИЕ

feature - pragma 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'; # loads all features available in perl 5.10

use v5.10;           # implicitly loads :5.10 feature bundle

ОПИСАНИЕ

Обычно невозможно добавить новую синтаксическую конструкцию в Perl без нарушения работы некоторых существующих программ. Это pragma предоставляет способ минимизировать этот риск. Новые синтаксические конструкции или новые семантические значения старых конструкций могут быть включены с помощью use feature 'foo', и будут анализироваться только тогда, когда соответствующее pragma функции находится в области видимости. (Тем не менее, префикс CORE:: обеспечивает доступ ко всем ключевым словам Perl, независимо от этого pragma).

Свойства области видимости

Как и другие pragmas (use strict, например), функции имеют свойства области видимости. use feature qw(foo) функция "foo" будет доступна только с этого момента до конца содержащего блока.

{
    use feature 'say';
    say "say is available here";
}
print "But not here.\n";

no feature

Функции также могут быть выключены с помощью no feature "foo". Это также имеет свойства области видимости.

use feature 'say';
say "say is available here";
{
    no feature 'say';
    print "But not here.\n";
}
say "Yet it is here.";

no feature без указания функций будет сброшено к группе по умолчанию. Чтобы отключить все функции (необычный запрос!), используйте no feature ':all'.

ДОСТУПНЫЕ ФУНКЦИИ

Функция 'say'

use feature 'say' сообщает компилятору включить функцию Perl 6 say.

См. "say" в perlfunc для получения подробной информации.

Эта функция доступна начиная с Perl 5.10.

Функция 'state'

use feature 'state' сообщает компилятору включить переменные state.

См. "Постоянные частные переменные" в perlsub для получения подробной информации.

Эта функция доступна начиная с Perl 5.10.

Функция 'switch'

ПРЕДУПРЕЖДЕНИЕ: Поскольку оператор smartmatch экспериментальный, Perl будет выводить предупреждение при использовании этой функции, если вы не отключили предупреждение явно:

no warnings "experimental::smartmatch";

use feature 'switch' сообщает компилятору включить конструкцию Perl 6 given/when.

См. "Условные операторы" в perlsyn для получения подробной информации.

Эта функция доступна начиная с Perl 5.10.

Функция 'unicode_strings'

use feature 'unicode_strings' сообщает компилятору использовать правила Юникода во всех операциях со строками, выполненных в пределах его области видимости (если они также не находятся в области видимости use locale или use bytes). То же самое относится ко всем регулярным выражениям, скомпилированным в пределах области видимости, даже если они выполняются за ее пределами. Она не изменяет внутреннее представление строк, а только то, как они интерпретируются.

no feature 'unicode_strings' сообщает компилятору использовать традиционные правила Perl, где используются правила нативного набора символов, если Perl не явно понимает, что требуется Юникод. Это может привести к некоторым неожиданным результатам, когда поведение внезапно меняется. (См. "Ошибка Юникода" в perlunicode для получения подробной информации.) По этой причине, если вы потенциально используете Юникод в своей программе, use feature 'unicode_strings' subpragma настоятельно рекомендуется.

Эта функция доступна начиная с Perl 5.12; была почти полностью реализована в Perl 5.14; и расширена в Perl 5.16, чтобы охватить quotemeta; была дополнительно расширена в Perl 5.26, чтобы охватить оператор диапазона; и была еще раз расширена в Perl 5.28, чтобы охватить специальные случаи разбиения по пробелам.

Функции 'unicode_eval' и 'evalbytes'

Вместе эти две функции предназначены для замены устаревшей функции eval строк, которая в некоторых случаях работает проблемно. Они доступны начиная с Perl 5.16 и включены по умолчанию с объявлением use 5.16 или выше.

unicode_eval изменяет поведение обычной функции eval строк, чтобы работать более последовательно, особенно в среде Юникода. Некоторые (ошибочные) поведения не могли быть изменены без нарушения некоторых аспектов, которые на них опирались, поэтому функция может быть включена и отключена. Подробности см. в "Внутри функции "unicode_eval" в perlfunc.

evalbytes похожа на функцию eval строк, но работает с потоком байтов, который не закодирован в UTF-8. Подробности см. в "evalbytes EXPR" в perlfunc. Без объявления use feature 'evalbytes' ни use v5.16 (или выше) в текущей области видимости, вы по-прежнему можете получить доступ к ней, написав вместо этого CORE::evalbytes.

Функция 'current_sub'

Это предоставляет токен __SUB__ для получения ссылки на текущую подпрограмму или undef вне подпрограммы.

Эта функция доступна начиная с Perl 5.16.

Функция 'array_base'

Эта функция поддерживала устаревшую переменную $[. См. "$[" в perlvar. Она была включена по умолчанию, но отключена в use v5.16 (см. "НЕЯВНАЯ ЗАГРУЗКА", ниже) и недоступна с perl 5.30.

Эта функция доступна под этим именем начиная с Perl 5.16. В предыдущих версиях она просто была включена постоянно, и это pragma не знала о ней ничего.

Функция 'fc'

use feature 'fc' сообщает компилятору включить функцию fc, которая реализует преобразование регистров Unicode.

См. "fc" в perlfunc для получения подробной информации.

Эта функция доступна начиная с Perl 5.16.

Функция 'lexical_subs'

В версиях Perl до 5.26 эта функция включала объявление подпрограмм с помощью синтаксиса my sub foo, state sub foo и our sub foo. См. "Лексические подпрограммы" в perlsub для получения подробной информации.

Эта функция доступна начиная с Perl 5.18. С Perl 5.18 по 5.24 она считалась экспериментальной, и Perl выводил предупреждение при ее использовании, за исключением случаев явного отключения:

no warnings "experimental::lexical_subs";

Начиная с Perl 5.26, использование этой функции больше не вызывает предупреждений, хотя категория предупреждений experimental::lexical_subs по-прежнему существует (для совместимости с кодом, который ее отключает). Кроме того, этот синтаксис не только больше не является экспериментальным, но и включен для всего кода Perl, независимо от того, какие объявления функций находятся в области видимости.

Функции 'postderef' и 'postderef_qq'

Функция 'postderef_qq' расширяет область применения синтаксиса постфиксной дескрипции постфиксной дескрипции так, что постфиксная дескрипция массивов и скаляров доступны в интерполяциях двойных кавычек. Например, это делает следующие два утверждения эквивалентными:

my $s = "[@{ $h->{a} }]";
my $s = "[$h->{a}->@*]";

Эта функция доступна начиная с Perl 5.20. В Perl 5.20 и 5.22 она считалась экспериментальной, и Perl выводил предупреждение при ее использовании, за исключением случаев явного отключения:

no warnings "experimental::postderef";

Начиная с Perl 5.24, использование этой функции больше не вызывает предупреждений, хотя категория предупреждений experimental::postderef по-прежнему существует (для совместимости с кодом, который ее отключает).

Функция 'postderef' использовалась в Perl 5.20 и Perl 5.22 для включения синтаксиса постфиксной дескрипции за пределами интерполяций двойных кавычек. В этих версиях использование ее вызывало предупреждение experimental::postderef аналогичным образом, как и функция 'postderef_qq'. Начиная с Perl 5.24, этот синтаксис не только больше не является экспериментальным, но и включен для всего кода Perl, независимо от того, какие объявления функций находятся в области видимости.

Функция 'signatures'

ПРЕДУПРЕЖДЕНИЕ: Эта функция всё ещё находится в стадии разработки, и реализация может измениться в будущих версиях Perl. По этой причине Perl будет выводить предупреждение при использовании функции, если вы не отключили предупреждение явно:

no warnings "experimental::signatures";

Это позволяет распаковывать аргументы подпрограммы в лексические переменные, используя синтаксис, такой как

sub foo ($left, $right) {
    return $left + $right;
}

См. "Подписи" в perlsub для получения подробной информации.

Эта функция доступна начиная с Perl 5.20.

Функция 'refaliasing'

ПРЕДУПРЕЖДЕНИЕ: Эта функция всё ещё находится в стадии разработки, и реализация может измениться в будущих версиях Perl. По этой причине Perl будет выводить предупреждение при использовании функции, если вы не отключили предупреждение явно:

no warnings "experimental::refaliasing";

Это позволяет создание алиасов посредством присваивания ссылкам:

\$a = \$b; # $a and $b now point to the same scalar
\@a = \@b; #                     to the same array
\%a = \%b;
\&a = \&b;
foreach \%hash (@array_of_hash_refs) {
    ...
}

См. "Присваивание ссылкам" в perlref для получения подробной информации.

Эта функция доступна начиная с Perl 5.22.

Функция 'bitwise'

Это заставляет четыре стандартных побитовых оператора (& | ^ ~) обрабатывать свои операнды как числа, а также вводит четыре новых точечных оператора (&. |. ^. ~.) для обработки операндов как строк. То же самое относится к вариантам присваивания (&= |= ^= &.= |.= ^.=).

Подробности см. в разделе "Побитовые строковые операторы" в perlop.

Эта функция доступна начиная с Perl 5.22. Начиная с Perl 5.28, use v5.28 включит эту функцию. До версии 5.28 она оставалась экспериментальной и выводила предупреждение в категории "experimental::bitwise".

Функция 'declared_refs'

ПРЕДУПРЕЖДЕНИЕ: Эта функция всё ещё находится на стадии разработки, и её реализация может измениться в будущих версиях Perl. По этой причине Perl выведет предупреждение при использовании функции, если вы не отключили это предупреждение явно:

no warnings "experimental::declared_refs";

Это позволяет объявить ссылку на переменную с помощью my, state, our our, или локализовать с помощью local. Она предназначена главным образом для использования совместно с функцией "refaliasing". Примеры см. в разделе "Объявление ссылки на переменную" в perlref.

Эта функция доступна начиная с Perl 5.26.

Функция 'isa'

Это позволяет использовать инфиксный оператор isa, который проверяет, является ли скаляр, заданный левым операндом, объектом класса, заданного правым операндом. Дополнительные сведения см. в разделе "Оператор класса-экземпляра" в perlop.

Эта функция доступна начиная с Perl 5.32.

Функция 'indirect'

Эта функция позволяет использовать синтаксис косвенных объектов для вызовов методов, например new Foo 1, 2;. Она включена по умолчанию, но может быть отключена для запрета косвенного синтаксиса объектов.

Эта функция доступна под этим именем начиная с Perl 5.32. В предыдущих версиях она была всегда включена. Чтобы запретить (или вывести предупреждение о) синтаксисе косвенных объектов в более старых версиях Perl, см. модуль indirect CPAN.

НАБОРЫ ФУНКЦИЙ

Можно загрузить несколько функций вместе, используя набор функций. Имя набора функций предваряется двоеточием, чтобы отличить его от фактической функции.

use feature ":5.10";

Доступны следующие наборы функций:

bundle    features included
--------- -----------------
:default  indirect

:5.10     say state switch indirect

:5.12     say state switch unicode_strings indirect

:5.14     say state switch unicode_strings indirect

:5.16     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          indirect

:5.18     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          indirect

:5.20     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          indirect

:5.22     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          indirect

:5.24     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          postderef_qq indirect

:5.26     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          postderef_qq indirect

:5.28     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          postderef_qq bitwise indirect

:5.30     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          postderef_qq bitwise indirect

:5.32     say state switch unicode_strings
          unicode_eval evalbytes current_sub fc
          postderef_qq bitwise indirect

Набор :default представляет набор функций, который включён до объявления use feature или no feature.

Указание подверсий, таких как 0 в 5.14.0 в наборах функций, не имеет эффекта. Гарантируется, что наборы функций будут одинаковыми для всех под-версий.

use feature ":5.14.0";    # same as ":5.14"
use feature ":5.14.1";    # same as ":5.14"

НЕЯВНАЯ ЗАГРУЗКА

Вместо загрузки наборов функций по имени проще позволить Perl выполнить неявную загрузку набора функций за вас.

Есть два способа неявной загрузки прагмы feature:

  • Использование ключа -E на командной строке Perl вместо -e. Это включит набор функций для этой версии Perl в главном модуле компиляции (то есть, в однострочном скрипте, который следует за -E).

  • Явное требование минимальной версии Perl для вашей программы с помощью конструкции use VERSION. То есть,

    use v5.10.0;

    выполнит неявную

    no feature ':all';
    use feature ':5.10';

    и так далее. Обратите внимание, как конечная под-версия автоматически удаляется из версии.

    Однако, чтобы избежать предупреждений о переносимости (см. "use" в perlfunc), вы можете предпочесть:

    use 5.010;

    с тем же эффектом.

    Если требуемая версия старше Perl 5.10, вместо неё автоматически загружается набор функций ":default".

    В отличие от use feature ":5.12", указание use v5.12 (или любой более новой версии) также выполняет эквивалент use strict; см. "use" в perlfunc для получения дополнительной информации.

© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.32.0/feature

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API