1package feature; 2 3our $VERSION = '1.16'; 4 5# (feature name) => (internal name, used in %^H) 6my %feature = ( 7 switch => 'feature_switch', 8 say => "feature_say", 9 state => "feature_state", 10 unicode_strings => "feature_unicode", 11); 12 13# This gets set (for now) in $^H as well as in %^H, 14# for runtime speed of the uc/lc/ucfirst/lcfirst functions. 15# See HINT_UNI_8_BIT in perl.h. 16our $hint_uni8bit = 0x00000800; 17 18# NB. the latest bundle must be loaded by the -E switch (see toke.c) 19 20my %feature_bundle = ( 21 "5.10" => [qw(switch say state)], 22 "5.11" => [qw(switch say state unicode_strings)], 23 "5.12" => [qw(switch say state unicode_strings)], 24); 25 26# special case 27$feature_bundle{"5.9.5"} = $feature_bundle{"5.10"}; 28 29# TODO: 30# - think about versioned features (use feature switch => 2) 31 32=head1 NAME 33 34feature - Perl pragma to enable new features 35 36=head1 SYNOPSIS 37 38 use feature qw(switch say); 39 given ($foo) { 40 when (1) { say "\$foo == 1" } 41 when ([2,3]) { say "\$foo == 2 || \$foo == 3" } 42 when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" } 43 when ($_ > 100) { say "\$foo > 100" } 44 default { say "None of the above" } 45 } 46 47 use feature ':5.10'; # loads all features available in perl 5.10 48 49=head1 DESCRIPTION 50 51It is usually impossible to add new syntax to Perl without breaking 52some existing programs. This pragma provides a way to minimize that 53risk. New syntactic constructs, or new semantic meanings to older 54constructs, can be enabled by C<use feature 'foo'>, and will be parsed 55only when the appropriate feature pragma is in scope. 56 57=head2 Lexical effect 58 59Like other pragmas (C<use strict>, for example), features have a lexical 60effect. C<use feature qw(foo)> will only make the feature "foo" available 61from that point to the end of the enclosing block. 62 63 { 64 use feature 'say'; 65 say "say is available here"; 66 } 67 print "But not here.\n"; 68 69=head2 C<no feature> 70 71Features can also be turned off by using C<no feature "foo">. This too 72has lexical effect. 73 74 use feature 'say'; 75 say "say is available here"; 76 { 77 no feature 'say'; 78 print "But not here.\n"; 79 } 80 say "Yet it is here."; 81 82C<no feature> with no features specified will turn off all features. 83 84=head2 The 'switch' feature 85 86C<use feature 'switch'> tells the compiler to enable the Perl 6 87given/when construct. 88 89See L<perlsyn/"Switch statements"> for details. 90 91=head2 The 'say' feature 92 93C<use feature 'say'> tells the compiler to enable the Perl 6 94C<say> function. 95 96See L<perlfunc/say> for details. 97 98=head2 the 'state' feature 99 100C<use feature 'state'> tells the compiler to enable C<state> 101variables. 102 103See L<perlsub/"Persistent Private Variables"> for details. 104 105=head2 the 'unicode_strings' feature 106 107C<use feature 'unicode_strings'> tells the compiler to treat 108all strings outside of C<use locale> and C<use bytes> as Unicode. It is 109available starting with Perl 5.11.3. 110 111See L<perlunicode/The "Unicode Bug"> for details. 112 113=head1 FEATURE BUNDLES 114 115It's possible to load a whole slew of features in one go, using 116a I<feature bundle>. The name of a feature bundle is prefixed with 117a colon, to distinguish it from an actual feature. At present, the 118only feature bundle is C<use feature ":5.10"> which is equivalent 119to C<use feature qw(switch say state)>. 120 121Specifying sub-versions such as the C<0> in C<5.10.0> in feature bundles has 122no effect: feature bundles are guaranteed to be the same for all sub-versions. 123 124=head1 IMPLICIT LOADING 125 126There are two ways to load the C<feature> pragma implicitly : 127 128=over 4 129 130=item * 131 132By using the C<-E> switch on the command-line instead of C<-e>. It enables 133all available features in the main compilation unit (that is, the one-liner.) 134 135=item * 136 137By requiring explicitly a minimal Perl version number for your program, with 138the C<use VERSION> construct, and when the version is higher than or equal to 1395.10.0. That is, 140 141 use 5.10.0; 142 143will do an implicit 144 145 use feature ':5.10'; 146 147and so on. Note how the trailing sub-version is automatically stripped from the 148version. 149 150But to avoid portability warnings (see L<perlfunc/use>), you may prefer: 151 152 use 5.010; 153 154with the same effect. 155 156=back 157 158=cut 159 160sub import { 161 my $class = shift; 162 if (@_ == 0) { 163 croak("No features specified"); 164 } 165 while (@_) { 166 my $name = shift(@_); 167 if (substr($name, 0, 1) eq ":") { 168 my $v = substr($name, 1); 169 if (!exists $feature_bundle{$v}) { 170 $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/; 171 if (!exists $feature_bundle{$v}) { 172 unknown_feature_bundle(substr($name, 1)); 173 } 174 } 175 unshift @_, @{$feature_bundle{$v}}; 176 next; 177 } 178 if (!exists $feature{$name}) { 179 unknown_feature($name); 180 } 181 $^H{$feature{$name}} = 1; 182 $^H |= $hint_uni8bit if $name eq 'unicode_strings'; 183 } 184} 185 186sub unimport { 187 my $class = shift; 188 189 # A bare C<no feature> should disable *all* features 190 if (!@_) { 191 delete @^H{ values(%feature) }; 192 $^H &= ~ $hint_uni8bit; 193 return; 194 } 195 196 while (@_) { 197 my $name = shift; 198 if (substr($name, 0, 1) eq ":") { 199 my $v = substr($name, 1); 200 if (!exists $feature_bundle{$v}) { 201 $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/; 202 if (!exists $feature_bundle{$v}) { 203 unknown_feature_bundle(substr($name, 1)); 204 } 205 } 206 unshift @_, @{$feature_bundle{$v}}; 207 next; 208 } 209 if (!exists($feature{$name})) { 210 unknown_feature($name); 211 } 212 else { 213 delete $^H{$feature{$name}}; 214 $^H &= ~ $hint_uni8bit if $name eq 'unicode_strings'; 215 } 216 } 217} 218 219sub unknown_feature { 220 my $feature = shift; 221 croak(sprintf('Feature "%s" is not supported by Perl %vd', 222 $feature, $^V)); 223} 224 225sub unknown_feature_bundle { 226 my $feature = shift; 227 croak(sprintf('Feature bundle "%s" is not supported by Perl %vd', 228 $feature, $^V)); 229} 230 231sub croak { 232 require Carp; 233 Carp::croak(@_); 234} 235 2361; 237