5 # (feature name) => (internal name, used in %^H)
8 state => 'feature_state',
9 switch => 'feature_switch',
10 evalbytes => 'feature_evalbytes',
11 unicode_eval => 'feature_unieval',
12 unicode_strings => 'feature_unicode',
15 # This gets set (for now) in $^H as well as in %^H,
16 # for runtime speed of the uc/lc/ucfirst/lcfirst functions.
17 # See HINT_UNI_8_BIT in perl.h.
18 our $hint_uni8bit = 0x00000800;
20 # NB. the latest bundle must be loaded by the -E switch (see toke.c)
22 my %feature_bundle = (
23 "5.10" => [qw(say state switch)],
24 "5.11" => [qw(say state switch unicode_strings)],
25 "5.12" => [qw(say state switch unicode_strings)],
26 "5.13" => [qw(say state switch unicode_strings)],
27 "5.14" => [qw(say state switch unicode_strings)],
28 "5.15" => [qw(say state switch unicode_strings unicode_eval
33 $feature_bundle{"5.9.5"} = $feature_bundle{"5.10"};
36 # - think about versioned features (use feature switch => 2)
40 feature - Perl pragma to enable new features
44 use feature qw(say switch);
46 when (1) { say "\$foo == 1" }
47 when ([2,3]) { say "\$foo == 2 || \$foo == 3" }
48 when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
49 when ($_ > 100) { say "\$foo > 100" }
50 default { say "None of the above" }
53 use feature ':5.10'; # loads all features available in perl 5.10
57 It is usually impossible to add new syntax to Perl without breaking
58 some existing programs. This pragma provides a way to minimize that
59 risk. New syntactic constructs, or new semantic meanings to older
60 constructs, can be enabled by C<use feature 'foo'>, and will be parsed
61 only when the appropriate feature pragma is in scope. (Nevertheless, the
62 C<CORE::> prefix provides access to all Perl keywords, regardless of this
67 Like other pragmas (C<use strict>, for example), features have a lexical
68 effect. C<use feature qw(foo)> will only make the feature "foo" available
69 from that point to the end of the enclosing block.
73 say "say is available here";
75 print "But not here.\n";
79 Features can also be turned off by using C<no feature "foo">. This too
83 say "say is available here";
86 print "But not here.\n";
88 say "Yet it is here.";
90 C<no feature> with no features specified will turn off all features.
92 =head2 The 'say' feature
94 C<use feature 'say'> tells the compiler to enable the Perl 6
97 See L<perlfunc/say> for details.
99 =head2 the 'state' feature
101 C<use feature 'state'> tells the compiler to enable C<state>
104 See L<perlsub/"Persistent Private Variables"> for details.
106 =head2 The 'switch' feature
108 C<use feature 'switch'> tells the compiler to enable the Perl 6
109 given/when construct.
111 See L<perlsyn/"Switch statements"> for details.
113 =head2 the 'unicode_strings' feature
115 C<use feature 'unicode_strings'> tells the compiler to use Unicode semantics
116 in all string operations executed within its scope (unless they are also
117 within the scope of either C<use locale> or C<use bytes>). The same applies
118 to all regular expressions compiled within the scope, even if executed outside
121 C<no feature 'unicode_strings'> tells the compiler to use the traditional
122 Perl semantics wherein the native character set semantics is used unless it is
123 clear to Perl that Unicode is desired. This can lead to some surprises
124 when the behavior suddenly changes. (See
125 L<perlunicode/The "Unicode Bug"> for details.) For this reason, if you are
126 potentially using Unicode in your program, the
127 C<use feature 'unicode_strings'> subpragma is B<strongly> recommended.
129 This subpragma is available starting with Perl 5.11.3, but was not fully
130 implemented until 5.13.8.
132 =head2 the 'unicode_eval' and 'evalbytes' features
134 Under the C<unicode_eval> feature, Perl's C<eval> function, when passed a
135 string, will evaluate it as a string of characters, ignoring any
136 C<use utf8> declarations. C<use utf8> exists to declare the encoding of
137 the script, which only makes sense for a stream of bytes, not a string of
138 characters. Source filters are forbidden, as they also really only make
139 sense on strings of bytes. Any attempt to activate a source filter will
142 The C<evalbytes> feature enables the C<evalbytes> keyword, which evaluates
143 the argument passed to it as a string of bytes. It dies if the string
144 contains any characters outside the 8-bit range. Source filters work
145 within C<evalbytes>: they apply to the contents of the string being
148 Together, these two features are intended to replace the historical C<eval>
149 function, which has (at least) two bugs in it, that cannot easily be fixed
150 without breaking existing programs:
156 C<eval> behaves differently depending on the internal encoding of the
157 string, sometimes treating its argument as a string of bytes, and sometimes
158 as a string of characters.
162 Source filters activated within C<eval> leak out into whichever I<file>
163 scope is currently being compiled. To give an example with the CPAN module
166 BEGIN { eval "use Semi::Semicolons; # not filtered here " }
169 C<evalbytes> fixes that to work the way one would expect:
171 use feature "evalbytes";
172 BEGIN { evalbytes "use Semi::Semicolons; # filtered " }
177 These two features are available starting with Perl 5.16.
179 =head1 FEATURE BUNDLES
181 It's possible to load a whole slew of features in one go, using
182 a I<feature bundle>. The name of a feature bundle is prefixed with
183 a colon, to distinguish it from an actual feature. At present, the
184 only feature bundles correspond to Perl releases, e.g. C<use feature
185 ":5.10"> which is equivalent to C<use feature qw(switch say state)>.
187 By convention, the feature bundle for any given Perl release includes
188 the features of previous releases, down to and including 5.10, the
189 first official release to provide this facility. Since Perl 5.12
190 only provides one new feature, C<unicode_strings>, and Perl 5.14
191 provides none, C<use feature ":5.14"> is equivalent to C<use feature
192 qw(switch say state unicode_strings)>.
194 Specifying sub-versions such as the C<0> in C<5.14.0> in feature bundles has
195 no effect: feature bundles are guaranteed to be the same for all sub-versions.
197 Note that instead of using release-based feature bundles it is usually
198 better, and shorter, to use implicit loading as described below.
200 =head1 IMPLICIT LOADING
202 There are two ways to load the C<feature> pragma implicitly :
208 By using the C<-E> switch on the command-line instead of C<-e>. It enables
209 all available features in the main compilation unit (that is, the one-liner.)
213 By requiring explicitly a minimal Perl version number for your program, with
214 the C<use VERSION> construct, and when the version is higher than or equal to
223 and so on. Note how the trailing sub-version is automatically stripped from the
226 But to avoid portability warnings (see L<perlfunc/use>), you may prefer:
230 with the same effect.
239 croak("No features specified");
242 my $name = shift(@_);
243 if (substr($name, 0, 1) eq ":") {
244 my $v = substr($name, 1);
245 if (!exists $feature_bundle{$v}) {
246 $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/;
247 if (!exists $feature_bundle{$v}) {
248 unknown_feature_bundle(substr($name, 1));
251 unshift @_, @{$feature_bundle{$v}};
254 if (!exists $feature{$name}) {
255 unknown_feature($name);
257 $^H{$feature{$name}} = 1;
258 $^H |= $hint_uni8bit if $name eq 'unicode_strings';
265 # A bare C<no feature> should disable *all* features
267 delete @^H{ values(%feature) };
268 $^H &= ~ $hint_uni8bit;
274 if (substr($name, 0, 1) eq ":") {
275 my $v = substr($name, 1);
276 if (!exists $feature_bundle{$v}) {
277 $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/;
278 if (!exists $feature_bundle{$v}) {
279 unknown_feature_bundle(substr($name, 1));
282 unshift @_, @{$feature_bundle{$v}};
285 if (!exists($feature{$name})) {
286 unknown_feature($name);
289 delete $^H{$feature{$name}};
290 $^H &= ~ $hint_uni8bit if $name eq 'unicode_strings';
295 sub unknown_feature {
297 croak(sprintf('Feature "%s" is not supported by Perl %vd',
301 sub unknown_feature_bundle {
303 croak(sprintf('Feature bundle "%s" is not supported by Perl %vd',