This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix for [perl #37999] lc() + Latin-1 chars is failing erratically
[perl5.git] / lib / feature.pm
CommitLineData
0d863452
RH
1package feature;
2
3our $VERSION = '1.00';
4$feature::hint_bits = 0x04020000; # HINT_LOCALIZE_HH | HINT_HH_FOR_EVAL
5
6# (feature name) => (internal name, used in %^H)
7my %feature = (
7b9ef140
RH
8 switch => 'feature_switch',
9 "~~" => "feature_~~",
10 say => "feature_say",
0d863452
RH
11);
12
13
14# Here are some notes that probably shouldn't be in the public
15# documentation, but which it's useful to have somewhere.
16#
17# One side-effect of the change is that C<prototype("CORE::continue")>
18# no longer throws the error C<Can't find an opnumber for "continue">.
19# One of the tests in t/op/cproto.t had to be changed to accommodate
20# this, but it really shouldn't affect real-world code.
21#
22# TODO:
23# - sort out the smartmatch semantics
24# - think about versioned features (use switch => 2)
25#
26# -- Robin 2005-12
27
28=head1 NAME
29
30feature - Perl pragma to enable new syntactic features
31
32=head1 SYNOPSIS
33
34 use feature 'switch';
35 given ($foo) {
36 when (1) { print "\$foo == 1\n" }
37 when ([2,3]) { print "\$foo == 2 || \$foo == 3\n" }
38 when (/^a[bc]d$/) { print "\$foo eq 'abd' || \$foo eq 'acd'\n" }
39 when ($_ > 100) { print "\$foo > 100\n" }
40 default { print "None of the above\n" }
41 }
42
43=head1 DESCRIPTION
44
45It is usually impossible to add new syntax to Perl without breaking
46some existing programs. This pragma provides a way to minimize that
47risk. New syntactic constructs can be enabled by C<use feature 'foo'>,
48and will be parsed only when the appropriate feature pragma is in
49scope.
50
51=head2 The 'switch' feature
52
53C<use feature 'switch'> tells the compiler to enable the Perl 6
54given/when construct from here to the end of the enclosing BLOCK.
55
56See L<perlsyn/"Switch statements"> for details.
57
58=head2 The '~~' feature
59
60C<use feature '~~'> tells the compiler to enable the Perl 6
61smart match C<~~> operator from here to the end of the enclosing BLOCK.
62
63See L<perlsyn/"Smart Matching in Detail"> for details.
64
65=head2 The 'say' feature
66
67C<use feature 'say'> tells the compiler to enable the Perl 6
68C<say> function from here to the end of the enclosing BLOCK.
69
70See L<perlfunc/say> for details.
71
72=cut
73
74sub import {
75 $^H |= $feature::hint_bits; # Need this or %^H won't work
76
77 my $class = shift;
78 if (@_ == 0) {
79 require Carp;
80 Carp->import("croak");
81 croak("No features specified");
82 }
83 while (@_) {
84 my $name = shift(@_);
85 if (!exists $feature{$name}) {
86 require Carp;
87 Carp->import("croak");
88 croak(sprintf('Feature "%s" is not supported by Perl %vd',
89 $name, $^V));
90 }
91 $^H{$feature{$name}} = 1;
92 }
93}
94
95sub unimport {
96 my $class = shift;
97
98 # A bare C<no feature> should disable *all* features
99 for my $name (@_) {
100 if (!exists($feature{$name})) {
101 require Carp;
102 Carp->import("croak");
103 croak(sprintf('Feature "%s" is not supported by Perl %vd',
104 $name, $^V));
105 }
106 else {
107 delete $^H{$feature{$name}};
108 }
109 }
110
111 if(!@_) {
112 delete @^H{ values(%feature) };
113 }
114}
115
1161;