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
{ use feature 'say'; say "say is available here"; } print "But not here.\n";
use feature 'say'; say "say is available here"; { no feature 'say'; print "But not here.\n"; } say "Yet it is here.";
"no feature" with no features specified will reset to the default group. To disable all features (an unusual request!) use "no feature ':all'".
See ``say'' in perlfunc for details.
This feature is available starting with Perl 5.10.
See ``Persistent Private Variables'' in perlsub for details.
This feature is available starting with Perl 5.10.
no warnings "experimental::smartmatch";
"use feature 'switch'" tells the compiler to enable the Perl 6 given/when construct.
See ``Switch Statements'' in perlsyn for details.
This feature is available starting with Perl 5.10.
"no feature 'unicode_strings'" tells the compiler to use the traditional Perl rules wherein the native character set rules is used unless it is clear to Perl that Unicode is desired. This can lead to some surprises when the behavior suddenly changes. (See ``The ''Unicode Bug"" in perlunicode for details.) For this reason, if you are potentially using Unicode in your program, the "use feature 'unicode_strings'" subpragma is strongly recommended.
This feature is available starting with Perl 5.12; was almost fully implemented in Perl 5.14; and extended in Perl 5.16 to cover "quotemeta"; was extended further in Perl 5.26 to cover the range operator; and was extended again in Perl 5.28 to cover special-cased whitespace splitting.
"unicode_eval" changes the behavior of plain string "eval" to work more consistently, especially in the Unicode world. Certain (mis)behaviors couldn't be changed without breaking some things that had come to rely on them, so the feature can be enabled and disabled. Details are at ``Under the ''unicode_eval`` feature'' in perlfunc.
"evalbytes" is like string "eval", but operating on a byte stream that is not UTF-8 encoded. Details are at ``evalbytes EXPR'' in perlfunc. Without a "use feature 'evalbytes'" nor a "use v5.16" (or higher) declaration in the current scope, you can still access it by instead writing "CORE::evalbytes".
This feature is available starting with Perl 5.16.
This feature is available under this name starting with Perl 5.16. In previous versions, it was simply on all the time, and this pragma knew nothing about it.
See ``fc'' in perlfunc for details.
This feature is available from Perl 5.16 onwards.
This feature is available from Perl 5.18 onwards. From Perl 5.18 to 5.24, it was classed as experimental, and Perl emitted a warning for its usage, except when explicitly disabled:
no warnings "experimental::lexical_subs";
As of Perl 5.26, use of this feature no longer triggers a warning, though the "experimental::lexical_subs" warning category still exists (for compatibility with code that disables it). In addition, this syntax is not only no longer experimental, but it is enabled for all Perl code, regardless of what feature declarations are in scope.
my $s = "[@{ $h->{a} }]"; my $s = "[$h->{a}->@*]";
This feature is available from Perl 5.20 onwards. In Perl 5.20 and 5.22, it was classed as experimental, and Perl emitted a warning for its usage, except when explicitly disabled:
no warnings "experimental::postderef";
As of Perl 5.24, use of this feature no longer triggers a warning, though the "experimental::postderef" warning category still exists (for compatibility with code that disables it).
The 'postderef' feature was used in Perl 5.20 and Perl 5.22 to enable postfix dereference syntax outside double-quotish interpolations. In those versions, using it triggered the "experimental::postderef" warning in the same way as the 'postderef_qq' feature did. As of Perl 5.24, this syntax is not only no longer experimental, but it is enabled for all Perl code, regardless of what feature declarations are in scope.
no warnings "experimental::signatures";
This enables unpacking of subroutine arguments into lexical variables by syntax such as
sub foo ($left, $right) { return $left + $right; }
See ``Signatures'' in perlsub for details.
This feature is available from Perl 5.20 onwards.
no warnings "experimental::refaliasing";
This enables aliasing via assignment to references:
\$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) { ... }
See ``Assigning to References'' in perlref for details.
This feature is available from Perl 5.22 onwards.
See ``Bitwise String Operators'' in perlop for details.
This feature is available from Perl 5.22 onwards. Starting in Perl 5.28, "use v5.28" will enable the feature. Before 5.28, it was still experimental and would emit a warning in the ``experimental::bitwise'' category.
no warnings "experimental::declared_refs";
This allows a reference to a variable to be declared with "my", "state", our "our", or localized with "local". It is intended mainly for use in conjunction with the ``refaliasing'' feature. See ``Declaring a Reference to a Variable'' in perlref for examples.
This feature is available from Perl 5.26 onwards.
This feature is available from Perl 5.32 onwards.
This feature is available under this name from Perl 5.32 onwards. In previous versions, it was simply on all the time. To disallow (or warn on) indirect object syntax on older Perls, see the indirect CPAN module.
use feature ":5.10";
The following feature bundles are available:
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
The ":default" bundle represents the feature set that is enabled before any "use feature" or "no feature" declaration.
Specifying sub-versions such as the 0 in 5.14.0 in feature bundles has no effect. Feature bundles are guaranteed to be the same for all sub-versions.
use feature ":5.14.0"; # same as ":5.14" use feature ":5.14.1"; # same as ":5.14"
There are two ways to load the "feature" pragma implicitly:
use v5.10.0;
will do an implicit
no feature ':all'; use feature ':5.10';
and so on. Note how the trailing sub-version is automatically stripped from the version.
But to avoid portability warnings (see ``use'' in perlfunc), you may prefer:
use 5.010;
with the same effect.
If the required version is older than Perl 5.10, the ``:default'' feature bundle is automatically loaded instead.
Unlike "use feature ":5.12"", saying "use v5.12" (or any higher version) also does the equivalent of "use strict"; see ``use'' in perlfunc for details.