Spec-Zone.ru › Perl 5.34

функция

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
    • Лексическое влияние
    • отсутствует функция
  • ДОСТУПНЫЕ ФУНКЦИИ
    • Функция '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'
    • Функция 'multidimensional'
    • Функция 'bareword_filehandles'
    • Функция 'try'
  • ПАКЕТЫ ФУНКЦИЙ
  • НЕЯВНАЯ ЗАГРУЗКА

ИМЯ

feature - Perl pragma для включения новых функций

СИНОПСИС

use feature qw(fc say);

# Without the "use feature" above, this code would not be able to find
# the built-ins "say" or "fc":
say "The case-folded version of $x is: " . fc $x;


# set features to match the :5.10 bundle, which may turn off or on
# multiple features (see below)
use feature ':5.10';


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

ОПИСАНИЕ

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

Лексическое влияние

Как и другие pragmas (use strict, например), функции имеют лексическое влияние. use feature qw(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' сообщает компилятору включить функцию say.

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

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

Функция 'state'

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

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

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

Функция 'switch'

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

no warnings "experimental::smartmatch";

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

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

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

Функция 'unicode_strings'

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

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

Эта функция доступна начиная с 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. Некоторые (неверные) поведения нельзя было изменить, не сломав некоторые вещи, которые от них зависели, поэтому функция может быть включена и отключена. Подробности находятся в "В разделе "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'

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

no warnings "experimental::isa";

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

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

Функция 'indirect'

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

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

Функция 'multidimensional'

Эта функция активирует эмуляцию многомерных массивов, функции Perl 4 (или более ранней версии), которая использовалась для эмуляции многомерных массивов с помощью хэшей. Это работает путём преобразования кода, например, $foo{$x, $y} в $foo{join($;, $x, $y)}. Она включена по умолчанию, но может быть выключена для отключения эмуляции многомерных массивов.

При отключении этой функции синтаксис, который обычно заменяется, будет сообщать об ошибке компиляции.

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

Вы можете использовать модуль multidimensional на CPAN для отключения эмуляции многомерных массивов для старых версий Perl.

Функция 'bareword_filehandles'

Эта функция активирует использование имён файлов в виде "голых слов" для операций встроенных функций, что является в целом не рекомендуемой практикой. Она включена по умолчанию, но может быть выключена для запрещения "голых слов" для имён файлов, за исключением перечисленных ниже исключений.

Встроенные имена файлов Perl STDIN, STDOUT, STDERR, DATA, ARGV, ARGVOUT и специальный _ всегда включены.

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

Вы можете использовать модуль bareword::filehandles на CPAN для отключения использования "голых слов" для имён файлов в старых версиях Perl.

Функция 'try'

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

no warnings "experimental::try";

Эта функция включает синтаксис try и catch, что позволяет обрабатывать исключения, где исключения, сгенерированные в теле блока, введённого с помощью try, перехватываются путём выполнения тела блока catch.

Дополнительную информацию см. в разделе "Обработка исключений try-catch" в perlsyn.

ПАКЕТЫ ФУНКЦИЙ

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

use feature ":5.10";

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

bundle    features included
--------- -----------------
:default  indirect multidimensional
          bareword_filehandles

:5.10     bareword_filehandles indirect
          multidimensional say state switch

:5.12     bareword_filehandles indirect
          multidimensional say state switch
          unicode_strings

:5.14     bareword_filehandles indirect
          multidimensional say state switch
          unicode_strings

:5.16     bareword_filehandles current_sub evalbytes
          fc indirect multidimensional say state
          switch unicode_eval unicode_strings

:5.18     bareword_filehandles current_sub evalbytes
          fc indirect multidimensional say state
          switch unicode_eval unicode_strings

:5.20     bareword_filehandles current_sub evalbytes
          fc indirect multidimensional say state
          switch unicode_eval unicode_strings

:5.22     bareword_filehandles current_sub evalbytes
          fc indirect multidimensional say state
          switch unicode_eval unicode_strings

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

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

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

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

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

:5.34     bareword_filehandles bitwise current_sub
          evalbytes fc indirect multidimensional
          postderef_qq say state switch unicode_eval
          unicode_strings

Пакет :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–2021 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.34.0/feature

Spec-Zone.ru

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