1*e0680481Safresh1# -*- mode: Perl; buffer-read-only: t -*- 2898184e3Ssthen# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! 3898184e3Ssthen# This file is built by regen/feature.pl. 4898184e3Ssthen# Any changes made here will be lost! 5898184e3Ssthen 6850e2753Smillertpackage feature; 7*e0680481Safresh1our $VERSION = '1.82'; 8850e2753Smillert 9898184e3Ssthenour %feature = ( 10898184e3Ssthen fc => 'feature_fc', 1156d68f1eSafresh1 isa => 'feature_isa', 12898184e3Ssthen say => 'feature_say', 13eac174f2Safresh1 try => 'feature_try', 14*e0680481Safresh1 class => 'feature_class', 15eac174f2Safresh1 defer => 'feature_defer', 16898184e3Ssthen state => 'feature_state', 17850e2753Smillert switch => 'feature_switch', 18b8851fccSafresh1 bitwise => 'feature_bitwise', 1956d68f1eSafresh1 indirect => 'feature_indirect', 20898184e3Ssthen evalbytes => 'feature_evalbytes', 216fb12b70Safresh1 signatures => 'feature_signatures', 22898184e3Ssthen current_sub => 'feature___SUB__', 23*e0680481Safresh1 module_true => 'feature_module_true', 24b8851fccSafresh1 refaliasing => 'feature_refaliasing', 256fb12b70Safresh1 postderef_qq => 'feature_postderef_qq', 26898184e3Ssthen unicode_eval => 'feature_unieval', 279f11ffb7Safresh1 declared_refs => 'feature_myref', 28898184e3Ssthen unicode_strings => 'feature_unicode', 29eac174f2Safresh1 multidimensional => 'feature_multidimensional', 30eac174f2Safresh1 bareword_filehandles => 'feature_bareword_filehandles', 31eac174f2Safresh1 extra_paired_delimiters => 'feature_more_delims', 32850e2753Smillert); 33850e2753Smillert 34898184e3Ssthenour %feature_bundle = ( 35eac174f2Safresh1 "5.10" => [qw(bareword_filehandles indirect multidimensional say state switch)], 36eac174f2Safresh1 "5.11" => [qw(bareword_filehandles indirect multidimensional say state switch unicode_strings)], 37eac174f2Safresh1 "5.15" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional say state switch unicode_eval unicode_strings)], 38eac174f2Safresh1 "5.23" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)], 39eac174f2Safresh1 "5.27" => [qw(bareword_filehandles bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)], 40eac174f2Safresh1 "5.35" => [qw(bareword_filehandles bitwise current_sub evalbytes fc isa postderef_qq say signatures state unicode_eval unicode_strings)], 41*e0680481Safresh1 "5.37" => [qw(bitwise current_sub evalbytes fc isa module_true postderef_qq say signatures state unicode_eval unicode_strings)], 42*e0680481Safresh1 "all" => [qw(bareword_filehandles bitwise class current_sub declared_refs defer evalbytes extra_paired_delimiters fc indirect isa module_true multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)], 43eac174f2Safresh1 "default" => [qw(bareword_filehandles indirect multidimensional)], 44898184e3Ssthen); 45898184e3Ssthen 46898184e3Ssthen$feature_bundle{"5.12"} = $feature_bundle{"5.11"}; 47898184e3Ssthen$feature_bundle{"5.13"} = $feature_bundle{"5.11"}; 48898184e3Ssthen$feature_bundle{"5.14"} = $feature_bundle{"5.11"}; 49898184e3Ssthen$feature_bundle{"5.16"} = $feature_bundle{"5.15"}; 5091f110e0Safresh1$feature_bundle{"5.17"} = $feature_bundle{"5.15"}; 5191f110e0Safresh1$feature_bundle{"5.18"} = $feature_bundle{"5.15"}; 526fb12b70Safresh1$feature_bundle{"5.19"} = $feature_bundle{"5.15"}; 536fb12b70Safresh1$feature_bundle{"5.20"} = $feature_bundle{"5.15"}; 54b8851fccSafresh1$feature_bundle{"5.21"} = $feature_bundle{"5.15"}; 55b8851fccSafresh1$feature_bundle{"5.22"} = $feature_bundle{"5.15"}; 56b8851fccSafresh1$feature_bundle{"5.24"} = $feature_bundle{"5.23"}; 579f11ffb7Safresh1$feature_bundle{"5.25"} = $feature_bundle{"5.23"}; 589f11ffb7Safresh1$feature_bundle{"5.26"} = $feature_bundle{"5.23"}; 599f11ffb7Safresh1$feature_bundle{"5.28"} = $feature_bundle{"5.27"}; 60b46d8ef2Safresh1$feature_bundle{"5.29"} = $feature_bundle{"5.27"}; 61b46d8ef2Safresh1$feature_bundle{"5.30"} = $feature_bundle{"5.27"}; 6256d68f1eSafresh1$feature_bundle{"5.31"} = $feature_bundle{"5.27"}; 6356d68f1eSafresh1$feature_bundle{"5.32"} = $feature_bundle{"5.27"}; 64eac174f2Safresh1$feature_bundle{"5.33"} = $feature_bundle{"5.27"}; 65eac174f2Safresh1$feature_bundle{"5.34"} = $feature_bundle{"5.27"}; 66eac174f2Safresh1$feature_bundle{"5.36"} = $feature_bundle{"5.35"}; 67*e0680481Safresh1$feature_bundle{"5.38"} = $feature_bundle{"5.37"}; 68898184e3Ssthen$feature_bundle{"5.9.5"} = $feature_bundle{"5.10"}; 699f11ffb7Safresh1my %noops = ( 709f11ffb7Safresh1 postderef => 1, 719f11ffb7Safresh1 lexical_subs => 1, 729f11ffb7Safresh1); 73b46d8ef2Safresh1my %removed = ( 74b46d8ef2Safresh1 array_base => 1, 75b46d8ef2Safresh1); 76898184e3Ssthen 77898184e3Ssthenour $hint_shift = 26; 78eac174f2Safresh1our $hint_mask = 0x3c000000; 79*e0680481Safresh1our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 5.35 5.37 ); 80898184e3Ssthen 81b39c5158Smillert# This gets set (for now) in $^H as well as in %^H, 82b39c5158Smillert# for runtime speed of the uc/lc/ucfirst/lcfirst functions. 83b39c5158Smillert# See HINT_UNI_8_BIT in perl.h. 84b39c5158Smillertour $hint_uni8bit = 0x00000800; 85b39c5158Smillert 86850e2753Smillert# TODO: 87850e2753Smillert# - think about versioned features (use feature switch => 2) 88850e2753Smillert 89eac174f2Safresh1=encoding utf8 90eac174f2Safresh1 91850e2753Smillert=head1 NAME 92850e2753Smillert 93b39c5158Smillertfeature - Perl pragma to enable new features 94850e2753Smillert 95850e2753Smillert=head1 SYNOPSIS 96850e2753Smillert 97eac174f2Safresh1 use feature qw(fc say); 98850e2753Smillert 99eac174f2Safresh1 # Without the "use feature" above, this code would not be able to find 100eac174f2Safresh1 # the built-ins "say" or "fc": 101eac174f2Safresh1 say "The case-folded version of $x is: " . fc $x; 102850e2753Smillert 103eac174f2Safresh1 104*e0680481Safresh1 # set features to match the :5.36 bundle, which may turn off or on 105*e0680481Safresh1 # multiple features (see "FEATURE BUNDLES" below) 106*e0680481Safresh1 use feature ':5.36'; 107eac174f2Safresh1 108eac174f2Safresh1 109*e0680481Safresh1 # implicitly loads :5.36 feature bundle 110*e0680481Safresh1 use v5.36; 111898184e3Ssthen 112850e2753Smillert=head1 DESCRIPTION 113850e2753Smillert 114850e2753SmillertIt is usually impossible to add new syntax to Perl without breaking 115850e2753Smillertsome existing programs. This pragma provides a way to minimize that 116b39c5158Smillertrisk. New syntactic constructs, or new semantic meanings to older 117b39c5158Smillertconstructs, can be enabled by C<use feature 'foo'>, and will be parsed 118898184e3Ssthenonly when the appropriate feature pragma is in scope. (Nevertheless, the 119898184e3SsthenC<CORE::> prefix provides access to all Perl keywords, regardless of this 120898184e3Ssthenpragma.) 121850e2753Smillert 122850e2753Smillert=head2 Lexical effect 123850e2753Smillert 124850e2753SmillertLike other pragmas (C<use strict>, for example), features have a lexical 125850e2753Smillerteffect. C<use feature qw(foo)> will only make the feature "foo" available 126850e2753Smillertfrom that point to the end of the enclosing block. 127850e2753Smillert 128850e2753Smillert { 129850e2753Smillert use feature 'say'; 130850e2753Smillert say "say is available here"; 131850e2753Smillert } 132850e2753Smillert print "But not here.\n"; 133850e2753Smillert 134850e2753Smillert=head2 C<no feature> 135850e2753Smillert 136850e2753SmillertFeatures can also be turned off by using C<no feature "foo">. This too 137850e2753Smillerthas lexical effect. 138850e2753Smillert 139850e2753Smillert use feature 'say'; 140850e2753Smillert say "say is available here"; 141850e2753Smillert { 142850e2753Smillert no feature 'say'; 143850e2753Smillert print "But not here.\n"; 144850e2753Smillert } 145850e2753Smillert say "Yet it is here."; 146850e2753Smillert 147898184e3SsthenC<no feature> with no features specified will reset to the default group. To 148898184e3Ssthendisable I<all> features (an unusual request!) use C<no feature ':all'>. 149850e2753Smillert 150898184e3Ssthen=head1 AVAILABLE FEATURES 151850e2753Smillert 152*e0680481Safresh1Read L</"FEATURE BUNDLES"> for the feature cheat sheet summary. 153*e0680481Safresh1 154850e2753Smillert=head2 The 'say' feature 155850e2753Smillert 156eac174f2Safresh1C<use feature 'say'> tells the compiler to enable the Raku-inspired 157850e2753SmillertC<say> function. 158850e2753Smillert 159850e2753SmillertSee L<perlfunc/say> for details. 160850e2753Smillert 161898184e3SsthenThis feature is available starting with Perl 5.10. 162898184e3Ssthen 163898184e3Ssthen=head2 The 'state' feature 164850e2753Smillert 165850e2753SmillertC<use feature 'state'> tells the compiler to enable C<state> 166850e2753Smillertvariables. 167850e2753Smillert 168850e2753SmillertSee L<perlsub/"Persistent Private Variables"> for details. 169850e2753Smillert 170898184e3SsthenThis feature is available starting with Perl 5.10. 171b39c5158Smillert 172898184e3Ssthen=head2 The 'switch' feature 173b39c5158Smillert 174eac174f2Safresh1B<WARNING>: This feature is still experimental and the implementation may 175eac174f2Safresh1change or be removed in future versions of Perl. For this reason, Perl will 176eac174f2Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 177b8851fccSafresh1 178b8851fccSafresh1 no warnings "experimental::smartmatch"; 179b8851fccSafresh1 180eac174f2Safresh1C<use feature 'switch'> tells the compiler to enable the Raku 181898184e3Ssthengiven/when construct. 182898184e3Ssthen 183898184e3SsthenSee L<perlsyn/"Switch Statements"> for details. 184898184e3Ssthen 185898184e3SsthenThis feature is available starting with Perl 5.10. 186*e0680481Safresh1It is deprecated starting with Perl 5.38, and using 187*e0680481Safresh1C<given>, C<when> or smartmatch will throw a warning. 188*e0680481Safresh1It will be removed in Perl 5.42. 189898184e3Ssthen 190898184e3Ssthen=head2 The 'unicode_strings' feature 191898184e3Ssthen 1926fb12b70Safresh1C<use feature 'unicode_strings'> tells the compiler to use Unicode rules 193898184e3Ssthenin all string operations executed within its scope (unless they are also 194898184e3Ssthenwithin the scope of either C<use locale> or C<use bytes>). The same applies 195898184e3Ssthento all regular expressions compiled within the scope, even if executed outside 19691f110e0Safresh1it. It does not change the internal representation of strings, but only how 19791f110e0Safresh1they are interpreted. 198898184e3Ssthen 199898184e3SsthenC<no feature 'unicode_strings'> tells the compiler to use the traditional 2006fb12b70Safresh1Perl rules wherein the native character set rules is used unless it is 201898184e3Ssthenclear to Perl that Unicode is desired. This can lead to some surprises 202898184e3Ssthenwhen the behavior suddenly changes. (See 203898184e3SsthenL<perlunicode/The "Unicode Bug"> for details.) For this reason, if you are 204898184e3Ssthenpotentially using Unicode in your program, the 205898184e3SsthenC<use feature 'unicode_strings'> subpragma is B<strongly> recommended. 206898184e3Ssthen 207898184e3SsthenThis feature is available starting with Perl 5.12; was almost fully 2089f11ffb7Safresh1implemented in Perl 5.14; and extended in Perl 5.16 to cover C<quotemeta>; 2099f11ffb7Safresh1was extended further in Perl 5.26 to cover L<the range 2109f11ffb7Safresh1operator|perlop/Range Operators>; and was extended again in Perl 5.28 to 2119f11ffb7Safresh1cover L<special-cased whitespace splitting|perlfunc/split>. 212898184e3Ssthen 213898184e3Ssthen=head2 The 'unicode_eval' and 'evalbytes' features 214898184e3Ssthen 2159f11ffb7Safresh1Together, these two features are intended to replace the legacy string 2169f11ffb7Safresh1C<eval> function, which behaves problematically in some instances. They are 2179f11ffb7Safresh1available starting with Perl 5.16, and are enabled by default by a 2189f11ffb7Safresh1S<C<use 5.16>> or higher declaration. 219898184e3Ssthen 2209f11ffb7Safresh1C<unicode_eval> changes the behavior of plain string C<eval> to work more 2219f11ffb7Safresh1consistently, especially in the Unicode world. Certain (mis)behaviors 2229f11ffb7Safresh1couldn't be changed without breaking some things that had come to rely on 2239f11ffb7Safresh1them, so the feature can be enabled and disabled. Details are at 2249f11ffb7Safresh1L<perlfunc/Under the "unicode_eval" feature>. 225898184e3Ssthen 226eac174f2Safresh1C<evalbytes> is like string C<eval>, but it treats its argument as a byte 227eac174f2Safresh1string. Details are at L<perlfunc/evalbytes EXPR>. Without a 2289f11ffb7Safresh1S<C<use feature 'evalbytes'>> nor a S<C<use v5.16>> (or higher) declaration in 2299f11ffb7Safresh1the current scope, you can still access it by instead writing 2309f11ffb7Safresh1C<CORE::evalbytes>. 231898184e3Ssthen 232898184e3Ssthen=head2 The 'current_sub' feature 233898184e3Ssthen 234898184e3SsthenThis provides the C<__SUB__> token that returns a reference to the current 235898184e3Ssthensubroutine or C<undef> outside of a subroutine. 236898184e3Ssthen 237898184e3SsthenThis feature is available starting with Perl 5.16. 238898184e3Ssthen 239898184e3Ssthen=head2 The 'array_base' feature 240898184e3Ssthen 241b46d8ef2Safresh1This feature supported the legacy C<$[> variable. See L<perlvar/$[>. 242b46d8ef2Safresh1It was on by default but disabled under C<use v5.16> (see 243b46d8ef2Safresh1L</IMPLICIT LOADING>, below) and unavailable since perl 5.30. 244898184e3Ssthen 245898184e3SsthenThis feature is available under this name starting with Perl 5.16. In 246898184e3Ssthenprevious versions, it was simply on all the time, and this pragma knew 247898184e3Ssthennothing about it. 248898184e3Ssthen 249898184e3Ssthen=head2 The 'fc' feature 250898184e3Ssthen 251898184e3SsthenC<use feature 'fc'> tells the compiler to enable the C<fc> function, 252898184e3Ssthenwhich implements Unicode casefolding. 253898184e3Ssthen 254898184e3SsthenSee L<perlfunc/fc> for details. 255898184e3Ssthen 256898184e3SsthenThis feature is available from Perl 5.16 onwards. 257b39c5158Smillert 25891f110e0Safresh1=head2 The 'lexical_subs' feature 25991f110e0Safresh1 2609f11ffb7Safresh1In Perl versions prior to 5.26, this feature enabled 2619f11ffb7Safresh1declaration of subroutines via C<my sub foo>, C<state sub foo> 2629f11ffb7Safresh1and C<our sub foo> syntax. See L<perlsub/Lexical Subroutines> for details. 2639f11ffb7Safresh1 2649f11ffb7Safresh1This feature is available from Perl 5.18 onwards. From Perl 5.18 to 5.24, 2659f11ffb7Safresh1it was classed as experimental, and Perl emitted a warning for its 2669f11ffb7Safresh1usage, except when explicitly disabled: 26791f110e0Safresh1 26891f110e0Safresh1 no warnings "experimental::lexical_subs"; 26991f110e0Safresh1 2709f11ffb7Safresh1As of Perl 5.26, use of this feature no longer triggers a warning, though 2719f11ffb7Safresh1the C<experimental::lexical_subs> warning category still exists (for 2729f11ffb7Safresh1compatibility with code that disables it). In addition, this syntax is 2739f11ffb7Safresh1not only no longer experimental, but it is enabled for all Perl code, 2749f11ffb7Safresh1regardless of what feature declarations are in scope. 27591f110e0Safresh1 27652736614Safresh1=head2 The 'postderef' and 'postderef_qq' features 27752736614Safresh1 278b8851fccSafresh1The 'postderef_qq' feature extends the applicability of L<postfix 279*e0680481Safresh1dereference syntax|perlref/Postfix Dereference Syntax> so that 280*e0680481Safresh1postfix array dereference, postfix scalar dereference, and 281*e0680481Safresh1postfix array highest index access are available in double-quotish interpolations. 282*e0680481Safresh1For example, it makes the following two statements equivalent: 283b8851fccSafresh1 284b8851fccSafresh1 my $s = "[@{ $h->{a} }]"; 285b8851fccSafresh1 my $s = "[$h->{a}->@*]"; 286b8851fccSafresh1 287b8851fccSafresh1This feature is available from Perl 5.20 onwards. In Perl 5.20 and 5.22, it 288b8851fccSafresh1was classed as experimental, and Perl emitted a warning for its 289b8851fccSafresh1usage, except when explicitly disabled: 29052736614Safresh1 29152736614Safresh1 no warnings "experimental::postderef"; 29252736614Safresh1 293b8851fccSafresh1As of Perl 5.24, use of this feature no longer triggers a warning, though 294b8851fccSafresh1the C<experimental::postderef> warning category still exists (for 295b8851fccSafresh1compatibility with code that disables it). 29652736614Safresh1 297b8851fccSafresh1The 'postderef' feature was used in Perl 5.20 and Perl 5.22 to enable 298b8851fccSafresh1postfix dereference syntax outside double-quotish interpolations. In those 299b8851fccSafresh1versions, using it triggered the C<experimental::postderef> warning in the 300b8851fccSafresh1same way as the 'postderef_qq' feature did. As of Perl 5.24, this syntax is 301b8851fccSafresh1not only no longer experimental, but it is enabled for all Perl code, 302b8851fccSafresh1regardless of what feature declarations are in scope. 30352736614Safresh1 3046fb12b70Safresh1=head2 The 'signatures' feature 3056fb12b70Safresh1 306eac174f2Safresh1This enables syntax for declaring subroutine arguments as lexical variables. 307eac174f2Safresh1For example, for this subroutine: 3086fb12b70Safresh1 3096fb12b70Safresh1 sub foo ($left, $right) { 3106fb12b70Safresh1 return $left + $right; 3116fb12b70Safresh1 } 3126fb12b70Safresh1 313eac174f2Safresh1Calling C<foo(3, 7)> will assign C<3> into C<$left> and C<7> into C<$right>. 314eac174f2Safresh1 3156fb12b70Safresh1See L<perlsub/Signatures> for details. 3166fb12b70Safresh1 317eac174f2Safresh1This feature is available from Perl 5.20 onwards. From Perl 5.20 to 5.34, 318eac174f2Safresh1it was classed as experimental, and Perl emitted a warning for its usage, 319eac174f2Safresh1except when explicitly disabled: 320eac174f2Safresh1 321eac174f2Safresh1 no warnings "experimental::signatures"; 322eac174f2Safresh1 323eac174f2Safresh1As of Perl 5.36, use of this feature no longer triggers a warning, though the 324eac174f2Safresh1C<experimental::signatures> warning category still exists (for compatibility 325eac174f2Safresh1with code that disables it). This feature is now considered stable, and is 326eac174f2Safresh1enabled automatically by C<use v5.36> (or higher). 3276fb12b70Safresh1 328b8851fccSafresh1=head2 The 'refaliasing' feature 329b8851fccSafresh1 330b8851fccSafresh1B<WARNING>: This feature is still experimental and the implementation may 331eac174f2Safresh1change or be removed in future versions of Perl. For this reason, Perl will 332eac174f2Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 333b8851fccSafresh1 334b8851fccSafresh1 no warnings "experimental::refaliasing"; 335b8851fccSafresh1 336b8851fccSafresh1This enables aliasing via assignment to references: 337b8851fccSafresh1 338b8851fccSafresh1 \$a = \$b; # $a and $b now point to the same scalar 339b8851fccSafresh1 \@a = \@b; # to the same array 340b8851fccSafresh1 \%a = \%b; 341b8851fccSafresh1 \&a = \&b; 342b8851fccSafresh1 foreach \%hash (@array_of_hash_refs) { 343b8851fccSafresh1 ... 344b8851fccSafresh1 } 345b8851fccSafresh1 346b8851fccSafresh1See L<perlref/Assigning to References> for details. 347b8851fccSafresh1 348b8851fccSafresh1This feature is available from Perl 5.22 onwards. 349b8851fccSafresh1 350b8851fccSafresh1=head2 The 'bitwise' feature 351b8851fccSafresh1 352b8851fccSafresh1This makes the four standard bitwise operators (C<& | ^ ~>) treat their 353b8851fccSafresh1operands consistently as numbers, and introduces four new dotted operators 354b8851fccSafresh1(C<&. |. ^. ~.>) that treat their operands consistently as strings. The 355b8851fccSafresh1same applies to the assignment variants (C<&= |= ^= &.= |.= ^.=>). 356b8851fccSafresh1 357b8851fccSafresh1See L<perlop/Bitwise String Operators> for details. 358b8851fccSafresh1 3599f11ffb7Safresh1This feature is available from Perl 5.22 onwards. Starting in Perl 5.28, 3609f11ffb7Safresh1C<use v5.28> will enable the feature. Before 5.28, it was still 3619f11ffb7Safresh1experimental and would emit a warning in the "experimental::bitwise" 3629f11ffb7Safresh1category. 3639f11ffb7Safresh1 3649f11ffb7Safresh1=head2 The 'declared_refs' feature 3659f11ffb7Safresh1 3669f11ffb7Safresh1B<WARNING>: This feature is still experimental and the implementation may 367eac174f2Safresh1change or be removed in future versions of Perl. For this reason, Perl will 368eac174f2Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 3699f11ffb7Safresh1 3709f11ffb7Safresh1 no warnings "experimental::declared_refs"; 3719f11ffb7Safresh1 3729f11ffb7Safresh1This allows a reference to a variable to be declared with C<my>, C<state>, 373*e0680481Safresh1or C<our>, or localized with C<local>. It is intended mainly for use in 3749f11ffb7Safresh1conjunction with the "refaliasing" feature. See L<perlref/Declaring a 3759f11ffb7Safresh1Reference to a Variable> for examples. 3769f11ffb7Safresh1 3779f11ffb7Safresh1This feature is available from Perl 5.26 onwards. 378b8851fccSafresh1 37956d68f1eSafresh1=head2 The 'isa' feature 38056d68f1eSafresh1 38156d68f1eSafresh1This allows the use of the C<isa> infix operator, which tests whether the 38256d68f1eSafresh1scalar given by the left operand is an object of the class given by the 38356d68f1eSafresh1right operand. See L<perlop/Class Instance Operator> for more details. 38456d68f1eSafresh1 385eac174f2Safresh1This feature is available from Perl 5.32 onwards. From Perl 5.32 to 5.34, 386eac174f2Safresh1it was classed as experimental, and Perl emitted a warning for its usage, 387eac174f2Safresh1except when explicitly disabled: 388eac174f2Safresh1 389eac174f2Safresh1 no warnings "experimental::isa"; 390eac174f2Safresh1 391eac174f2Safresh1As of Perl 5.36, use of this feature no longer triggers a warning (though the 392eac174f2Safresh1C<experimental::isa> warning category stilll exists for compatibility with 393eac174f2Safresh1code that disables it). This feature is now considered stable, and is enabled 394eac174f2Safresh1automatically by C<use v5.36> (or higher). 39556d68f1eSafresh1 39656d68f1eSafresh1=head2 The 'indirect' feature 39756d68f1eSafresh1 39856d68f1eSafresh1This feature allows the use of L<indirect object 39956d68f1eSafresh1syntax|perlobj/Indirect Object Syntax> for method calls, e.g. C<new 40056d68f1eSafresh1Foo 1, 2;>. It is enabled by default, but can be turned off to 40156d68f1eSafresh1disallow indirect object syntax. 40256d68f1eSafresh1 40356d68f1eSafresh1This feature is available under this name from Perl 5.32 onwards. In 40456d68f1eSafresh1previous versions, it was simply on all the time. To disallow (or 40556d68f1eSafresh1warn on) indirect object syntax on older Perls, see the L<indirect> 40656d68f1eSafresh1CPAN module. 40756d68f1eSafresh1 408eac174f2Safresh1=head2 The 'multidimensional' feature 409eac174f2Safresh1 410eac174f2Safresh1This feature enables multidimensional array emulation, a perl 4 (or 411eac174f2Safresh1earlier) feature that was used to emulate multidimensional arrays with 412eac174f2Safresh1hashes. This works by converting code like C<< $foo{$x, $y} >> into 413eac174f2Safresh1C<< $foo{join($;, $x, $y)} >>. It is enabled by default, but can be 414eac174f2Safresh1turned off to disable multidimensional array emulation. 415eac174f2Safresh1 416eac174f2Safresh1When this feature is disabled the syntax that is normally replaced 417eac174f2Safresh1will report a compilation error. 418eac174f2Safresh1 419eac174f2Safresh1This feature is available under this name from Perl 5.34 onwards. In 420eac174f2Safresh1previous versions, it was simply on all the time. 421eac174f2Safresh1 422eac174f2Safresh1You can use the L<multidimensional> module on CPAN to disable 423eac174f2Safresh1multidimensional array emulation for older versions of Perl. 424eac174f2Safresh1 425*e0680481Safresh1=head2 The 'bareword_filehandles' feature 426eac174f2Safresh1 427eac174f2Safresh1This feature enables bareword filehandles for builtin functions 428eac174f2Safresh1operations, a generally discouraged practice. It is enabled by 429eac174f2Safresh1default, but can be turned off to disable bareword filehandles, except 430eac174f2Safresh1for the exceptions listed below. 431eac174f2Safresh1 432eac174f2Safresh1The perl built-in filehandles C<STDIN>, C<STDOUT>, C<STDERR>, C<DATA>, 433eac174f2Safresh1C<ARGV>, C<ARGVOUT> and the special C<_> are always enabled. 434eac174f2Safresh1 435eac174f2Safresh1This feature is enabled under this name from Perl 5.34 onwards. In 436eac174f2Safresh1previous versions it was simply on all the time. 437eac174f2Safresh1 438eac174f2Safresh1You can use the L<bareword::filehandles> module on CPAN to disable 439eac174f2Safresh1bareword filehandles for older versions of perl. 440eac174f2Safresh1 441*e0680481Safresh1=head2 The 'try' feature 442eac174f2Safresh1 443eac174f2Safresh1B<WARNING>: This feature is still experimental and the implementation may 444eac174f2Safresh1change or be removed in future versions of Perl. For this reason, Perl will 445eac174f2Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 446eac174f2Safresh1 447eac174f2Safresh1 no warnings "experimental::try"; 448eac174f2Safresh1 449eac174f2Safresh1This feature enables the C<try> and C<catch> syntax, which allows exception 450eac174f2Safresh1handling, where exceptions thrown from the body of the block introduced with 451eac174f2Safresh1C<try> are caught by executing the body of the C<catch> block. 452eac174f2Safresh1 453eac174f2Safresh1For more information, see L<perlsyn/"Try Catch Exception Handling">. 454eac174f2Safresh1 455eac174f2Safresh1=head2 The 'defer' feature 456eac174f2Safresh1 457eac174f2Safresh1B<WARNING>: This feature is still experimental and the implementation may 458eac174f2Safresh1change or be removed in future versions of Perl. For this reason, Perl will 459eac174f2Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 460eac174f2Safresh1 461eac174f2Safresh1 no warnings "experimental::defer"; 462eac174f2Safresh1 463eac174f2Safresh1This feature enables the C<defer> block syntax, which allows a block of code 464eac174f2Safresh1to be deferred until when the flow of control leaves the block which contained 465eac174f2Safresh1it. For more details, see L<perlsyn/defer>. 466eac174f2Safresh1 467eac174f2Safresh1=head2 The 'extra_paired_delimiters' feature 468eac174f2Safresh1 469eac174f2Safresh1B<WARNING>: This feature is still experimental and the implementation may 470eac174f2Safresh1change or be removed in future versions of Perl. For this reason, Perl will 471eac174f2Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 472eac174f2Safresh1 473eac174f2Safresh1 no warnings "experimental::extra_paired_delimiters"; 474eac174f2Safresh1 475eac174f2Safresh1This feature enables the use of more paired string delimiters than the 476eac174f2Safresh1traditional four, S<C<< < > >>>, S<C<( )>>, S<C<{ }>>, and S<C<[ ]>>. When 477eac174f2Safresh1this feature is on, for example, you can say S<C<qrE<171>patE<187>>>. 478eac174f2Safresh1 479*e0680481Safresh1As with any usage of non-ASCII delimiters in a UTF-8-encoded source file, you 480*e0680481Safresh1will want to ensure the parser will decode the source code from UTF-8 bytes 481*e0680481Safresh1with a declaration such as C<use utf8>. 482*e0680481Safresh1 483eac174f2Safresh1This feature is available starting in Perl 5.36. 484eac174f2Safresh1 485eac174f2Safresh1The complete list of accepted paired delimiters as of Unicode 14.0 is: 486eac174f2Safresh1 487eac174f2Safresh1 ( ) U+0028, U+0029 LEFT/RIGHT PARENTHESIS 488eac174f2Safresh1 < > U+003C, U+003E LESS-THAN/GREATER-THAN SIGN 489eac174f2Safresh1 [ ] U+005B, U+005D LEFT/RIGHT SQUARE BRACKET 490eac174f2Safresh1 { } U+007B, U+007D LEFT/RIGHT CURLY BRACKET 491eac174f2Safresh1 « » U+00AB, U+00BB LEFT/RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 492eac174f2Safresh1 » « U+00BB, U+00AB RIGHT/LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 493eac174f2Safresh1 ܆ ܇ U+0706, U+0707 SYRIAC COLON SKEWED LEFT/RIGHT 494eac174f2Safresh1 ༺ ༻ U+0F3A, U+0F3B TIBETAN MARK GUG RTAGS GYON, TIBETAN MARK GUG 495eac174f2Safresh1 RTAGS GYAS 496eac174f2Safresh1 ༼ ༽ U+0F3C, U+0F3D TIBETAN MARK ANG KHANG GYON, TIBETAN MARK ANG 497eac174f2Safresh1 KHANG GYAS 498eac174f2Safresh1 ᚛ ᚜ U+169B, U+169C OGHAM FEATHER MARK, OGHAM REVERSED FEATHER MARK 499eac174f2Safresh1 ‘ ’ U+2018, U+2019 LEFT/RIGHT SINGLE QUOTATION MARK 500eac174f2Safresh1 ’ ‘ U+2019, U+2018 RIGHT/LEFT SINGLE QUOTATION MARK 501eac174f2Safresh1 “ ” U+201C, U+201D LEFT/RIGHT DOUBLE QUOTATION MARK 502eac174f2Safresh1 ” “ U+201D, U+201C RIGHT/LEFT DOUBLE QUOTATION MARK 503eac174f2Safresh1 ‵ ′ U+2035, U+2032 REVERSED PRIME, PRIME 504eac174f2Safresh1 ‶ ″ U+2036, U+2033 REVERSED DOUBLE PRIME, DOUBLE PRIME 505eac174f2Safresh1 ‷ ‴ U+2037, U+2034 REVERSED TRIPLE PRIME, TRIPLE PRIME 506eac174f2Safresh1 ‹ › U+2039, U+203A SINGLE LEFT/RIGHT-POINTING ANGLE QUOTATION MARK 507eac174f2Safresh1 › ‹ U+203A, U+2039 SINGLE RIGHT/LEFT-POINTING ANGLE QUOTATION MARK 508eac174f2Safresh1 ⁅ ⁆ U+2045, U+2046 LEFT/RIGHT SQUARE BRACKET WITH QUILL 509eac174f2Safresh1 ⁍ ⁌ U+204D, U+204C BLACK RIGHT/LEFTWARDS BULLET 510eac174f2Safresh1 ⁽ ⁾ U+207D, U+207E SUPERSCRIPT LEFT/RIGHT PARENTHESIS 511eac174f2Safresh1 ₍ ₎ U+208D, U+208E SUBSCRIPT LEFT/RIGHT PARENTHESIS 512eac174f2Safresh1 → ← U+2192, U+2190 RIGHT/LEFTWARDS ARROW 513eac174f2Safresh1 ↛ ↚ U+219B, U+219A RIGHT/LEFTWARDS ARROW WITH STROKE 514eac174f2Safresh1 ↝ ↜ U+219D, U+219C RIGHT/LEFTWARDS WAVE ARROW 515eac174f2Safresh1 ↠ ↞ U+21A0, U+219E RIGHT/LEFTWARDS TWO HEADED ARROW 516eac174f2Safresh1 ↣ ↢ U+21A3, U+21A2 RIGHT/LEFTWARDS ARROW WITH TAIL 517eac174f2Safresh1 ↦ ↤ U+21A6, U+21A4 RIGHT/LEFTWARDS ARROW FROM BAR 518eac174f2Safresh1 ↪ ↩ U+21AA, U+21A9 RIGHT/LEFTWARDS ARROW WITH HOOK 519eac174f2Safresh1 ↬ ↫ U+21AC, U+21AB RIGHT/LEFTWARDS ARROW WITH LOOP 520eac174f2Safresh1 ↱ ↰ U+21B1, U+21B0 UPWARDS ARROW WITH TIP RIGHT/LEFTWARDS 521eac174f2Safresh1 ↳ ↲ U+21B3, U+21B2 DOWNWARDS ARROW WITH TIP RIGHT/LEFTWARDS 522eac174f2Safresh1 ⇀ ↼ U+21C0, U+21BC RIGHT/LEFTWARDS HARPOON WITH BARB UPWARDS 523eac174f2Safresh1 ⇁ ↽ U+21C1, U+21BD RIGHT/LEFTWARDS HARPOON WITH BARB DOWNWARDS 524eac174f2Safresh1 ⇉ ⇇ U+21C9, U+21C7 RIGHT/LEFTWARDS PAIRED ARROWS 525eac174f2Safresh1 ⇏ ⇍ U+21CF, U+21CD RIGHT/LEFTWARDS DOUBLE ARROW WITH STROKE 526eac174f2Safresh1 ⇒ ⇐ U+21D2, U+21D0 RIGHT/LEFTWARDS DOUBLE ARROW 527eac174f2Safresh1 ⇛ ⇚ U+21DB, U+21DA RIGHT/LEFTWARDS TRIPLE ARROW 528eac174f2Safresh1 ⇝ ⇜ U+21DD, U+21DC RIGHT/LEFTWARDS SQUIGGLE ARROW 529eac174f2Safresh1 ⇢ ⇠ U+21E2, U+21E0 RIGHT/LEFTWARDS DASHED ARROW 530eac174f2Safresh1 ⇥ ⇤ U+21E5, U+21E4 RIGHT/LEFTWARDS ARROW TO BAR 531eac174f2Safresh1 ⇨ ⇦ U+21E8, U+21E6 RIGHT/LEFTWARDS WHITE ARROW 532eac174f2Safresh1 ⇴ ⬰ U+21F4, U+2B30 RIGHT/LEFT ARROW WITH SMALL CIRCLE 533eac174f2Safresh1 ⇶ ⬱ U+21F6, U+2B31 THREE RIGHT/LEFTWARDS ARROWS 534eac174f2Safresh1 ⇸ ⇷ U+21F8, U+21F7 RIGHT/LEFTWARDS ARROW WITH VERTICAL STROKE 535eac174f2Safresh1 ⇻ ⇺ U+21FB, U+21FA RIGHT/LEFTWARDS ARROW WITH DOUBLE VERTICAL 536eac174f2Safresh1 STROKE 537eac174f2Safresh1 ⇾ ⇽ U+21FE, U+21FD RIGHT/LEFTWARDS OPEN-HEADED ARROW 538eac174f2Safresh1 ∈ ∋ U+2208, U+220B ELEMENT OF, CONTAINS AS MEMBER 539eac174f2Safresh1 ∉ ∌ U+2209, U+220C NOT AN ELEMENT OF, DOES NOT CONTAIN AS MEMBER 540eac174f2Safresh1 ∊ ∍ U+220A, U+220D SMALL ELEMENT OF, SMALL CONTAINS AS MEMBER 541eac174f2Safresh1 ≤ ≥ U+2264, U+2265 LESS-THAN/GREATER-THAN OR EQUAL TO 542eac174f2Safresh1 ≦ ≧ U+2266, U+2267 LESS-THAN/GREATER-THAN OVER EQUAL TO 543eac174f2Safresh1 ≨ ≩ U+2268, U+2269 LESS-THAN/GREATER-THAN BUT NOT EQUAL TO 544eac174f2Safresh1 ≪ ≫ U+226A, U+226B MUCH LESS-THAN/GREATER-THAN 545eac174f2Safresh1 ≮ ≯ U+226E, U+226F NOT LESS-THAN/GREATER-THAN 546eac174f2Safresh1 ≰ ≱ U+2270, U+2271 NEITHER LESS-THAN/GREATER-THAN NOR EQUAL TO 547eac174f2Safresh1 ≲ ≳ U+2272, U+2273 LESS-THAN/GREATER-THAN OR EQUIVALENT TO 548eac174f2Safresh1 ≴ ≵ U+2274, U+2275 NEITHER LESS-THAN/GREATER-THAN NOR EQUIVALENT TO 549eac174f2Safresh1 ≺ ≻ U+227A, U+227B PRECEDES/SUCCEEDS 550eac174f2Safresh1 ≼ ≽ U+227C, U+227D PRECEDES/SUCCEEDS OR EQUAL TO 551eac174f2Safresh1 ≾ ≿ U+227E, U+227F PRECEDES/SUCCEEDS OR EQUIVALENT TO 552eac174f2Safresh1 ⊀ ⊁ U+2280, U+2281 DOES NOT PRECEDE/SUCCEED 553eac174f2Safresh1 ⊂ ⊃ U+2282, U+2283 SUBSET/SUPERSET OF 554eac174f2Safresh1 ⊄ ⊅ U+2284, U+2285 NOT A SUBSET/SUPERSET OF 555eac174f2Safresh1 ⊆ ⊇ U+2286, U+2287 SUBSET/SUPERSET OF OR EQUAL TO 556eac174f2Safresh1 ⊈ ⊉ U+2288, U+2289 NEITHER A SUBSET/SUPERSET OF NOR EQUAL TO 557eac174f2Safresh1 ⊊ ⊋ U+228A, U+228B SUBSET/SUPERSET OF WITH NOT EQUAL TO 558eac174f2Safresh1 ⊣ ⊢ U+22A3, U+22A2 LEFT/RIGHT TACK 559eac174f2Safresh1 ⊦ ⫞ U+22A6, U+2ADE ASSERTION, SHORT LEFT TACK 560eac174f2Safresh1 ⊨ ⫤ U+22A8, U+2AE4 TRUE, VERTICAL BAR DOUBLE LEFT TURNSTILE 561eac174f2Safresh1 ⊩ ⫣ U+22A9, U+2AE3 FORCES, DOUBLE VERTICAL BAR LEFT TURNSTILE 562eac174f2Safresh1 ⊰ ⊱ U+22B0, U+22B1 PRECEDES/SUCCEEDS UNDER RELATION 563eac174f2Safresh1 ⋐ ⋑ U+22D0, U+22D1 DOUBLE SUBSET/SUPERSET 564eac174f2Safresh1 ⋖ ⋗ U+22D6, U+22D7 LESS-THAN/GREATER-THAN WITH DOT 565eac174f2Safresh1 ⋘ ⋙ U+22D8, U+22D9 VERY MUCH LESS-THAN/GREATER-THAN 566eac174f2Safresh1 ⋜ ⋝ U+22DC, U+22DD EQUAL TO OR LESS-THAN/GREATER-THAN 567eac174f2Safresh1 ⋞ ⋟ U+22DE, U+22DF EQUAL TO OR PRECEDES/SUCCEEDS 568eac174f2Safresh1 ⋠ ⋡ U+22E0, U+22E1 DOES NOT PRECEDE/SUCCEED OR EQUAL 569eac174f2Safresh1 ⋦ ⋧ U+22E6, U+22E7 LESS-THAN/GREATER-THAN BUT NOT EQUIVALENT TO 570eac174f2Safresh1 ⋨ ⋩ U+22E8, U+22E9 PRECEDES/SUCCEEDS BUT NOT EQUIVALENT TO 571eac174f2Safresh1 ⋲ ⋺ U+22F2, U+22FA ELEMENT OF/CONTAINS WITH LONG HORIZONTAL STROKE 572eac174f2Safresh1 ⋳ ⋻ U+22F3, U+22FB ELEMENT OF/CONTAINS WITH VERTICAL BAR AT END OF 573eac174f2Safresh1 HORIZONTAL STROKE 574eac174f2Safresh1 ⋴ ⋼ U+22F4, U+22FC SMALL ELEMENT OF/CONTAINS WITH VERTICAL BAR AT 575eac174f2Safresh1 END OF HORIZONTAL STROKE 576eac174f2Safresh1 ⋶ ⋽ U+22F6, U+22FD ELEMENT OF/CONTAINS WITH OVERBAR 577eac174f2Safresh1 ⋷ ⋾ U+22F7, U+22FE SMALL ELEMENT OF/CONTAINS WITH OVERBAR 578eac174f2Safresh1 ⌈ ⌉ U+2308, U+2309 LEFT/RIGHT CEILING 579eac174f2Safresh1 ⌊ ⌋ U+230A, U+230B LEFT/RIGHT FLOOR 580eac174f2Safresh1 ⌦ ⌫ U+2326, U+232B ERASE TO THE RIGHT/LEFT 581eac174f2Safresh1 〈 〉 U+2329, U+232A LEFT/RIGHT-POINTING ANGLE BRACKET 582eac174f2Safresh1 ⍈ ⍇ U+2348, U+2347 APL FUNCTIONAL SYMBOL QUAD RIGHT/LEFTWARDS ARROW 583eac174f2Safresh1 ⏩ ⏪ U+23E9, U+23EA BLACK RIGHT/LEFT-POINTING DOUBLE TRIANGLE 584eac174f2Safresh1 ⏭ ⏮ U+23ED, U+23EE BLACK RIGHT/LEFT-POINTING DOUBLE TRIANGLE WITH 585eac174f2Safresh1 VERTICAL BAR 586eac174f2Safresh1 ☛ ☚ U+261B, U+261A BLACK RIGHT/LEFT POINTING INDEX 587eac174f2Safresh1 ☞ ☜ U+261E, U+261C WHITE RIGHT/LEFT POINTING INDEX 588eac174f2Safresh1 ⚞ ⚟ U+269E, U+269F THREE LINES CONVERGING RIGHT/LEFT 589eac174f2Safresh1 ❨ ❩ U+2768, U+2769 MEDIUM LEFT/RIGHT PARENTHESIS ORNAMENT 590eac174f2Safresh1 ❪ ❫ U+276A, U+276B MEDIUM FLATTENED LEFT/RIGHT PARENTHESIS ORNAMENT 591eac174f2Safresh1 ❬ ❭ U+276C, U+276D MEDIUM LEFT/RIGHT-POINTING ANGLE BRACKET 592eac174f2Safresh1 ORNAMENT 593eac174f2Safresh1 ❮ ❯ U+276E, U+276F HEAVY LEFT/RIGHT-POINTING ANGLE QUOTATION MARK 594eac174f2Safresh1 ORNAMENT 595eac174f2Safresh1 ❰ ❱ U+2770, U+2771 HEAVY LEFT/RIGHT-POINTING ANGLE BRACKET ORNAMENT 596eac174f2Safresh1 ❲ ❳ U+2772, U+2773 LIGHT LEFT/RIGHT TORTOISE SHELL BRACKET ORNAMENT 597eac174f2Safresh1 ❴ ❵ U+2774, U+2775 MEDIUM LEFT/RIGHT CURLY BRACKET ORNAMENT 598eac174f2Safresh1 ⟃ ⟄ U+27C3, U+27C4 OPEN SUBSET/SUPERSET 599eac174f2Safresh1 ⟅ ⟆ U+27C5, U+27C6 LEFT/RIGHT S-SHAPED BAG DELIMITER 600eac174f2Safresh1 ⟈ ⟉ U+27C8, U+27C9 REVERSE SOLIDUS PRECEDING SUBSET, SUPERSET 601eac174f2Safresh1 PRECEDING SOLIDUS 602eac174f2Safresh1 ⟞ ⟝ U+27DE, U+27DD LONG LEFT/RIGHT TACK 603eac174f2Safresh1 ⟦ ⟧ U+27E6, U+27E7 MATHEMATICAL LEFT/RIGHT WHITE SQUARE BRACKET 604eac174f2Safresh1 ⟨ ⟩ U+27E8, U+27E9 MATHEMATICAL LEFT/RIGHT ANGLE BRACKET 605eac174f2Safresh1 ⟪ ⟫ U+27EA, U+27EB MATHEMATICAL LEFT/RIGHT DOUBLE ANGLE BRACKET 606eac174f2Safresh1 ⟬ ⟭ U+27EC, U+27ED MATHEMATICAL LEFT/RIGHT WHITE TORTOISE SHELL 607eac174f2Safresh1 BRACKET 608eac174f2Safresh1 ⟮ ⟯ U+27EE, U+27EF MATHEMATICAL LEFT/RIGHT FLATTENED PARENTHESIS 609eac174f2Safresh1 ⟴ ⬲ U+27F4, U+2B32 RIGHT/LEFT ARROW WITH CIRCLED PLUS 610eac174f2Safresh1 ⟶ ⟵ U+27F6, U+27F5 LONG RIGHT/LEFTWARDS ARROW 611eac174f2Safresh1 ⟹ ⟸ U+27F9, U+27F8 LONG RIGHT/LEFTWARDS DOUBLE ARROW 612eac174f2Safresh1 ⟼ ⟻ U+27FC, U+27FB LONG RIGHT/LEFTWARDS ARROW FROM BAR 613eac174f2Safresh1 ⟾ ⟽ U+27FE, U+27FD LONG RIGHT/LEFTWARDS DOUBLE ARROW FROM BAR 614eac174f2Safresh1 ⟿ ⬳ U+27FF, U+2B33 LONG RIGHT/LEFTWARDS SQUIGGLE ARROW 615eac174f2Safresh1 ⤀ ⬴ U+2900, U+2B34 RIGHT/LEFTWARDS TWO-HEADED ARROW WITH VERTICAL 616eac174f2Safresh1 STROKE 617eac174f2Safresh1 ⤁ ⬵ U+2901, U+2B35 RIGHT/LEFTWARDS TWO-HEADED ARROW WITH DOUBLE 618eac174f2Safresh1 VERTICAL STROKE 619eac174f2Safresh1 ⤃ ⤂ U+2903, U+2902 RIGHT/LEFTWARDS DOUBLE ARROW WITH VERTICAL 620eac174f2Safresh1 STROKE 621eac174f2Safresh1 ⤅ ⬶ U+2905, U+2B36 RIGHT/LEFTWARDS TWO-HEADED ARROW FROM BAR 622eac174f2Safresh1 ⤇ ⤆ U+2907, U+2906 RIGHT/LEFTWARDS DOUBLE ARROW FROM BAR 623eac174f2Safresh1 ⤍ ⤌ U+290D, U+290C RIGHT/LEFTWARDS DOUBLE DASH ARROW 624eac174f2Safresh1 ⤏ ⤎ U+290F, U+290E RIGHT/LEFTWARDS TRIPLE DASH ARROW 625eac174f2Safresh1 ⤐ ⬷ U+2910, U+2B37 RIGHT/LEFTWARDS TWO-HEADED TRIPLE DASH ARROW 626eac174f2Safresh1 ⤑ ⬸ U+2911, U+2B38 RIGHT/LEFTWARDS ARROW WITH DOTTED STEM 627eac174f2Safresh1 ⤔ ⬹ U+2914, U+2B39 RIGHT/LEFTWARDS ARROW WITH TAIL WITH VERTICAL 628eac174f2Safresh1 STROKE 629eac174f2Safresh1 ⤕ ⬺ U+2915, U+2B3A RIGHT/LEFTWARDS ARROW WITH TAIL WITH DOUBLE 630eac174f2Safresh1 VERTICAL STROKE 631eac174f2Safresh1 ⤖ ⬻ U+2916, U+2B3B RIGHT/LEFTWARDS TWO-HEADED ARROW WITH TAIL 632eac174f2Safresh1 ⤗ ⬼ U+2917, U+2B3C RIGHT/LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH 633eac174f2Safresh1 VERTICAL STROKE 634eac174f2Safresh1 ⤘ ⬽ U+2918, U+2B3D RIGHT/LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH 635eac174f2Safresh1 DOUBLE VERTICAL STROKE 636eac174f2Safresh1 ⤚ ⤙ U+291A, U+2919 RIGHT/LEFTWARDS ARROW-TAIL 637eac174f2Safresh1 ⤜ ⤛ U+291C, U+291B RIGHT/LEFTWARDS DOUBLE ARROW-TAIL 638eac174f2Safresh1 ⤞ ⤝ U+291E, U+291D RIGHT/LEFTWARDS ARROW TO BLACK DIAMOND 639eac174f2Safresh1 ⤠ ⤟ U+2920, U+291F RIGHT/LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND 640eac174f2Safresh1 ⤳ ⬿ U+2933, U+2B3F WAVE ARROW POINTING DIRECTLY RIGHT/LEFT 641eac174f2Safresh1 ⤷ ⤶ U+2937, U+2936 ARROW POINTING DOWNWARDS THEN CURVING RIGHT/ 642eac174f2Safresh1 LEFTWARDS 643eac174f2Safresh1 ⥅ ⥆ U+2945, U+2946 RIGHT/LEFTWARDS ARROW WITH PLUS BELOW 644eac174f2Safresh1 ⥇ ⬾ U+2947, U+2B3E RIGHT/LEFTWARDS ARROW THROUGH X 645eac174f2Safresh1 ⥓ ⥒ U+2953, U+2952 RIGHT/LEFTWARDS HARPOON WITH BARB UP TO BAR 646eac174f2Safresh1 ⥗ ⥖ U+2957, U+2956 RIGHT/LEFTWARDS HARPOON WITH BARB DOWN TO BAR 647eac174f2Safresh1 ⥛ ⥚ U+295B, U+295A RIGHT/LEFTWARDS HARPOON WITH BARB UP FROM BAR 648eac174f2Safresh1 ⥟ ⥞ U+295F, U+295E RIGHT/LEFTWARDS HARPOON WITH BARB DOWN FROM BAR 649eac174f2Safresh1 ⥤ ⥢ U+2964, U+2962 RIGHT/LEFTWARDS HARPOON WITH BARB UP ABOVE 650eac174f2Safresh1 RIGHT/LEFTWARDS HARPOON WITH BARB DOWN 651eac174f2Safresh1 ⥬ ⥪ U+296C, U+296A RIGHT/LEFTWARDS HARPOON WITH BARB UP ABOVE LONG 652eac174f2Safresh1 DASH 653eac174f2Safresh1 ⥭ ⥫ U+296D, U+296B RIGHT/LEFTWARDS HARPOON WITH BARB DOWN BELOW 654eac174f2Safresh1 LONG DASH 655eac174f2Safresh1 ⥱ ⭀ U+2971, U+2B40 EQUALS SIGN ABOVE RIGHT/LEFTWARDS ARROW 656eac174f2Safresh1 ⥲ ⭁ U+2972, U+2B41 TILDE OPERATOR ABOVE RIGHTWARDS ARROW, REVERSE 657eac174f2Safresh1 TILDE OPERATOR ABOVE LEFTWARDS ARROW 658eac174f2Safresh1 ⥴ ⭋ U+2974, U+2B4B RIGHTWARDS ARROW ABOVE TILDE OPERATOR, 659eac174f2Safresh1 LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR 660eac174f2Safresh1 ⥵ ⭂ U+2975, U+2B42 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO, 661eac174f2Safresh1 LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO 662eac174f2Safresh1 ⥹ ⥻ U+2979, U+297B SUBSET/SUPERSET ABOVE RIGHT/LEFTWARDS ARROW 663eac174f2Safresh1 ⦃ ⦄ U+2983, U+2984 LEFT/RIGHT WHITE CURLY BRACKET 664eac174f2Safresh1 ⦅ ⦆ U+2985, U+2986 LEFT/RIGHT WHITE PARENTHESIS 665eac174f2Safresh1 ⦇ ⦈ U+2987, U+2988 Z NOTATION LEFT/RIGHT IMAGE BRACKET 666eac174f2Safresh1 ⦉ ⦊ U+2989, U+298A Z NOTATION LEFT/RIGHT BINDING BRACKET 667eac174f2Safresh1 ⦋ ⦌ U+298B, U+298C LEFT/RIGHT SQUARE BRACKET WITH UNDERBAR 668eac174f2Safresh1 ⦍ ⦐ U+298D, U+2990 LEFT/RIGHT SQUARE BRACKET WITH TICK IN TOP 669eac174f2Safresh1 CORNER 670eac174f2Safresh1 ⦏ ⦎ U+298F, U+298E LEFT/RIGHT SQUARE BRACKET WITH TICK IN BOTTOM 671eac174f2Safresh1 CORNER 672eac174f2Safresh1 ⦑ ⦒ U+2991, U+2992 LEFT/RIGHT ANGLE BRACKET WITH DOT 673eac174f2Safresh1 ⦓ ⦔ U+2993, U+2994 LEFT/RIGHT ARC LESS-THAN/GREATER-THAN BRACKET 674eac174f2Safresh1 ⦕ ⦖ U+2995, U+2996 DOUBLE LEFT/RIGHT ARC GREATER-THAN/LESS-THAN 675eac174f2Safresh1 BRACKET 676eac174f2Safresh1 ⦗ ⦘ U+2997, U+2998 LEFT/RIGHT BLACK TORTOISE SHELL BRACKET 677eac174f2Safresh1 ⦨ ⦩ U+29A8, U+29A9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW 678eac174f2Safresh1 POINTING UP AND RIGHT/LEFT 679eac174f2Safresh1 ⦪ ⦫ U+29AA, U+29AB MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW 680eac174f2Safresh1 POINTING DOWN AND RIGHT/LEFT 681eac174f2Safresh1 ⦳ ⦴ U+29B3, U+29B4 EMPTY SET WITH RIGHT/LEFT ARROW ABOVE 682eac174f2Safresh1 ⧀ ⧁ U+29C0, U+29C1 CIRCLED LESS-THAN/GREATER-THAN 683eac174f2Safresh1 ⧘ ⧙ U+29D8, U+29D9 LEFT/RIGHT WIGGLY FENCE 684eac174f2Safresh1 ⧚ ⧛ U+29DA, U+29DB LEFT/RIGHT DOUBLE WIGGLY FENCE 685eac174f2Safresh1 ⧼ ⧽ U+29FC, U+29FD LEFT/RIGHT-POINTING CURVED ANGLE BRACKET 686eac174f2Safresh1 ⩹ ⩺ U+2A79, U+2A7A LESS-THAN/GREATER-THAN WITH CIRCLE INSIDE 687eac174f2Safresh1 ⩻ ⩼ U+2A7B, U+2A7C LESS-THAN/GREATER-THAN WITH QUESTION MARK ABOVE 688eac174f2Safresh1 ⩽ ⩾ U+2A7D, U+2A7E LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO 689eac174f2Safresh1 ⩿ ⪀ U+2A7F, U+2A80 LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO WITH 690eac174f2Safresh1 DOT INSIDE 691eac174f2Safresh1 ⪁ ⪂ U+2A81, U+2A82 LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO WITH 692eac174f2Safresh1 DOT ABOVE 693eac174f2Safresh1 ⪃ ⪄ U+2A83, U+2A84 LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO WITH 694eac174f2Safresh1 DOT ABOVE RIGHT/LEFT 695eac174f2Safresh1 ⪅ ⪆ U+2A85, U+2A86 LESS-THAN/GREATER-THAN OR APPROXIMATE 696eac174f2Safresh1 ⪇ ⪈ U+2A87, U+2A88 LESS-THAN/GREATER-THAN AND SINGLE-LINE NOT 697eac174f2Safresh1 EQUAL TO 698eac174f2Safresh1 ⪉ ⪊ U+2A89, U+2A8A LESS-THAN/GREATER-THAN AND NOT APPROXIMATE 699eac174f2Safresh1 ⪍ ⪎ U+2A8D, U+2A8E LESS-THAN/GREATER-THAN ABOVE SIMILAR OR EQUAL 700eac174f2Safresh1 ⪕ ⪖ U+2A95, U+2A96 SLANTED EQUAL TO OR LESS-THAN/GREATER-THAN 701eac174f2Safresh1 ⪗ ⪘ U+2A97, U+2A98 SLANTED EQUAL TO OR LESS-THAN/GREATER-THAN WITH 702eac174f2Safresh1 DOT INSIDE 703eac174f2Safresh1 ⪙ ⪚ U+2A99, U+2A9A DOUBLE-LINE EQUAL TO OR LESS-THAN/GREATER-THAN 704eac174f2Safresh1 ⪛ ⪜ U+2A9B, U+2A9C DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN/ 705eac174f2Safresh1 GREATER-THAN 706eac174f2Safresh1 ⪝ ⪞ U+2A9D, U+2A9E SIMILAR OR LESS-THAN/GREATER-THAN 707eac174f2Safresh1 ⪟ ⪠ U+2A9F, U+2AA0 SIMILAR ABOVE LESS-THAN/GREATER-THAN ABOVE 708eac174f2Safresh1 EQUALS SIGN 709eac174f2Safresh1 ⪡ ⪢ U+2AA1, U+2AA2 DOUBLE NESTED LESS-THAN/GREATER-THAN 710eac174f2Safresh1 ⪦ ⪧ U+2AA6, U+2AA7 LESS-THAN/GREATER-THAN CLOSED BY CURVE 711eac174f2Safresh1 ⪨ ⪩ U+2AA8, U+2AA9 LESS-THAN/GREATER-THAN CLOSED BY CURVE ABOVE 712eac174f2Safresh1 SLANTED EQUAL 713eac174f2Safresh1 ⪪ ⪫ U+2AAA, U+2AAB SMALLER THAN/LARGER THAN 714eac174f2Safresh1 ⪬ ⪭ U+2AAC, U+2AAD SMALLER THAN/LARGER THAN OR EQUAL TO 715eac174f2Safresh1 ⪯ ⪰ U+2AAF, U+2AB0 PRECEDES/SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN 716eac174f2Safresh1 ⪱ ⪲ U+2AB1, U+2AB2 PRECEDES/SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO 717eac174f2Safresh1 ⪳ ⪴ U+2AB3, U+2AB4 PRECEDES/SUCCEEDS ABOVE EQUALS SIGN 718eac174f2Safresh1 ⪵ ⪶ U+2AB5, U+2AB6 PRECEDES/SUCCEEDS ABOVE NOT EQUAL TO 719eac174f2Safresh1 ⪷ ⪸ U+2AB7, U+2AB8 PRECEDES/SUCCEEDS ABOVE ALMOST EQUAL TO 720eac174f2Safresh1 ⪹ ⪺ U+2AB9, U+2ABA PRECEDES/SUCCEEDS ABOVE NOT ALMOST EQUAL TO 721eac174f2Safresh1 ⪻ ⪼ U+2ABB, U+2ABC DOUBLE PRECEDES/SUCCEEDS 722eac174f2Safresh1 ⪽ ⪾ U+2ABD, U+2ABE SUBSET/SUPERSET WITH DOT 723eac174f2Safresh1 ⪿ ⫀ U+2ABF, U+2AC0 SUBSET/SUPERSET WITH PLUS SIGN BELOW 724eac174f2Safresh1 ⫁ ⫂ U+2AC1, U+2AC2 SUBSET/SUPERSET WITH MULTIPLICATION SIGN BELOW 725eac174f2Safresh1 ⫃ ⫄ U+2AC3, U+2AC4 SUBSET/SUPERSET OF OR EQUAL TO WITH DOT ABOVE 726eac174f2Safresh1 ⫅ ⫆ U+2AC5, U+2AC6 SUBSET/SUPERSET OF ABOVE EQUALS SIGN 727eac174f2Safresh1 ⫇ ⫈ U+2AC7, U+2AC8 SUBSET/SUPERSET OF ABOVE TILDE OPERATOR 728eac174f2Safresh1 ⫉ ⫊ U+2AC9, U+2ACA SUBSET/SUPERSET OF ABOVE ALMOST EQUAL TO 729eac174f2Safresh1 ⫋ ⫌ U+2ACB, U+2ACC SUBSET/SUPERSET OF ABOVE NOT EQUAL TO 730eac174f2Safresh1 ⫏ ⫐ U+2ACF, U+2AD0 CLOSED SUBSET/SUPERSET 731eac174f2Safresh1 ⫑ ⫒ U+2AD1, U+2AD2 CLOSED SUBSET/SUPERSET OR EQUAL TO 732eac174f2Safresh1 ⫕ ⫖ U+2AD5, U+2AD6 SUBSET/SUPERSET ABOVE SUBSET/SUPERSET 733eac174f2Safresh1 ⫥ ⊫ U+2AE5, U+22AB DOUBLE VERTICAL BAR DOUBLE LEFT/RIGHT TURNSTILE 734eac174f2Safresh1 ⫷ ⫸ U+2AF7, U+2AF8 TRIPLE NESTED LESS-THAN/GREATER-THAN 735eac174f2Safresh1 ⫹ ⫺ U+2AF9, U+2AFA DOUBLE-LINE SLANTED LESS-THAN/GREATER-THAN OR 736eac174f2Safresh1 EQUAL TO 737eac174f2Safresh1 ⭆ ⭅ U+2B46, U+2B45 RIGHT/LEFTWARDS QUADRUPLE ARROW 738eac174f2Safresh1 ⭇ ⭉ U+2B47, U+2B49 REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW, 739eac174f2Safresh1 TILDE OPERATOR ABOVE LEFTWARDS ARROW 740eac174f2Safresh1 ⭈ ⭊ U+2B48, U+2B4A RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL 741eac174f2Safresh1 TO, LEFTWARDS ARROW ABOVE ALMOST EQUAL TO 742eac174f2Safresh1 ⭌ ⥳ U+2B4C, U+2973 RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR, 743eac174f2Safresh1 LEFTWARDS ARROW ABOVE TILDE OPERATOR 744eac174f2Safresh1 ⭢ ⭠ U+2B62, U+2B60 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW 745eac174f2Safresh1 ⭬ ⭪ U+2B6C, U+2B6A RIGHT/LEFTWARDS TRIANGLE-HEADED DASHED ARROW 746eac174f2Safresh1 ⭲ ⭰ U+2B72, U+2B70 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW TO BAR 747eac174f2Safresh1 ⭼ ⭺ U+2B7C, U+2B7A RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH 748eac174f2Safresh1 DOUBLE VERTICAL STROKE 749eac174f2Safresh1 ⮆ ⮄ U+2B86, U+2B84 RIGHT/LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS 750eac174f2Safresh1 ⮊ ⮈ U+2B8A, U+2B88 RIGHT/LEFTWARDS BLACK CIRCLED WHITE ARROW 751eac174f2Safresh1 ⮕ ⬅ U+2B95, U+2B05 RIGHT/LEFTWARDS BLACK ARROW 752eac174f2Safresh1 ⮚ ⮘ U+2B9A, U+2B98 THREE-D TOP-LIGHTED RIGHT/LEFTWARDS EQUILATERAL 753eac174f2Safresh1 ARROWHEAD 754eac174f2Safresh1 ⮞ ⮜ U+2B9E, U+2B9C BLACK RIGHT/LEFTWARDS EQUILATERAL ARROWHEAD 755eac174f2Safresh1 ⮡ ⮠ U+2BA1, U+2BA0 DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP 756eac174f2Safresh1 RIGHT/LEFTWARDS 757eac174f2Safresh1 ⮣ ⮢ U+2BA3, U+2BA2 UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP 758eac174f2Safresh1 RIGHT/LEFTWARDS 759eac174f2Safresh1 ⮩ ⮨ U+2BA9, U+2BA8 BLACK CURVED DOWNWARDS AND RIGHT/LEFTWARDS ARROW 760eac174f2Safresh1 ⮫ ⮪ U+2BAB, U+2BAA BLACK CURVED UPWARDS AND RIGHT/LEFTWARDS ARROW 761eac174f2Safresh1 ⮱ ⮰ U+2BB1, U+2BB0 RIBBON ARROW DOWN RIGHT/LEFT 762eac174f2Safresh1 ⮳ ⮲ U+2BB3, U+2BB2 RIBBON ARROW UP RIGHT/LEFT 763eac174f2Safresh1 ⯮ ⯬ U+2BEE, U+2BEC RIGHT/LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE 764eac174f2Safresh1 ARROWHEADS 765eac174f2Safresh1 ⸂ ⸃ U+2E02, U+2E03 LEFT/RIGHT SUBSTITUTION BRACKET 766eac174f2Safresh1 ⸃ ⸂ U+2E03, U+2E02 RIGHT/LEFT SUBSTITUTION BRACKET 767eac174f2Safresh1 ⸄ ⸅ U+2E04, U+2E05 LEFT/RIGHT DOTTED SUBSTITUTION BRACKET 768eac174f2Safresh1 ⸅ ⸄ U+2E05, U+2E04 RIGHT/LEFT DOTTED SUBSTITUTION BRACKET 769eac174f2Safresh1 ⸉ ⸊ U+2E09, U+2E0A LEFT/RIGHT TRANSPOSITION BRACKET 770eac174f2Safresh1 ⸊ ⸉ U+2E0A, U+2E09 RIGHT/LEFT TRANSPOSITION BRACKET 771eac174f2Safresh1 ⸌ ⸍ U+2E0C, U+2E0D LEFT/RIGHT RAISED OMISSION BRACKET 772eac174f2Safresh1 ⸍ ⸌ U+2E0D, U+2E0C RIGHT/LEFT RAISED OMISSION BRACKET 773eac174f2Safresh1 ⸑ ⸐ U+2E11, U+2E10 REVERSED FORKED PARAGRAPHOS, FORKED PARAGRAPHOS 774eac174f2Safresh1 ⸜ ⸝ U+2E1C, U+2E1D LEFT/RIGHT LOW PARAPHRASE BRACKET 775eac174f2Safresh1 ⸝ ⸜ U+2E1D, U+2E1C RIGHT/LEFT LOW PARAPHRASE BRACKET 776eac174f2Safresh1 ⸠ ⸡ U+2E20, U+2E21 LEFT/RIGHT VERTICAL BAR WITH QUILL 777eac174f2Safresh1 ⸡ ⸠ U+2E21, U+2E20 RIGHT/LEFT VERTICAL BAR WITH QUILL 778eac174f2Safresh1 ⸢ ⸣ U+2E22, U+2E23 TOP LEFT/RIGHT HALF BRACKET 779eac174f2Safresh1 ⸤ ⸥ U+2E24, U+2E25 BOTTOM LEFT/RIGHT HALF BRACKET 780eac174f2Safresh1 ⸦ ⸧ U+2E26, U+2E27 LEFT/RIGHT SIDEWAYS U BRACKET 781eac174f2Safresh1 ⸨ ⸩ U+2E28, U+2E29 LEFT/RIGHT DOUBLE PARENTHESIS 782eac174f2Safresh1 ⸶ ⸷ U+2E36, U+2E37 DAGGER WITH LEFT/RIGHT GUARD 783eac174f2Safresh1 ⹂ „ U+2E42, U+201E DOUBLE LOW-REVERSED-9 QUOTATION MARK, DOUBLE 784eac174f2Safresh1 LOW-9 QUOTATION MARK 785eac174f2Safresh1 ⹕ ⹖ U+2E55, U+2E56 LEFT/RIGHT SQUARE BRACKET WITH STROKE 786eac174f2Safresh1 ⹗ ⹘ U+2E57, U+2E58 LEFT/RIGHT SQUARE BRACKET WITH DOUBLE STROKE 787eac174f2Safresh1 ⹙ ⹚ U+2E59, U+2E5A TOP HALF LEFT/RIGHT PARENTHESIS 788eac174f2Safresh1 ⹛ ⹜ U+2E5B, U+2E5C BOTTOM HALF LEFT/RIGHT PARENTHESIS 789eac174f2Safresh1 〈 〉 U+3008, U+3009 LEFT/RIGHT ANGLE BRACKET 790eac174f2Safresh1 《 》 U+300A, U+300B LEFT/RIGHT DOUBLE ANGLE BRACKET 791eac174f2Safresh1 「 」 U+300C, U+300D LEFT/RIGHT CORNER BRACKET 792eac174f2Safresh1 『 』 U+300E, U+300F LEFT/RIGHT WHITE CORNER BRACKET 793eac174f2Safresh1 【 】 U+3010, U+3011 LEFT/RIGHT BLACK LENTICULAR BRACKET 794eac174f2Safresh1 〔 〕 U+3014, U+3015 LEFT/RIGHT TORTOISE SHELL BRACKET 795eac174f2Safresh1 〖 〗 U+3016, U+3017 LEFT/RIGHT WHITE LENTICULAR BRACKET 796eac174f2Safresh1 〘 〙 U+3018, U+3019 LEFT/RIGHT WHITE TORTOISE SHELL BRACKET 797eac174f2Safresh1 〚 〛 U+301A, U+301B LEFT/RIGHT WHITE SQUARE BRACKET 798eac174f2Safresh1 〝 〞 U+301D, U+301E REVERSED DOUBLE PRIME QUOTATION MARK, DOUBLE 799eac174f2Safresh1 PRIME QUOTATION MARK 800eac174f2Safresh1 ꧁ ꧂ U+A9C1, U+A9C2 JAVANESE LEFT/RIGHT RERENGGAN 801eac174f2Safresh1 ﴾ ﴿ U+FD3E, U+FD3F ORNATE LEFT/RIGHT PARENTHESIS 802eac174f2Safresh1 ﹙ ﹚ U+FE59, U+FE5A SMALL LEFT/RIGHT PARENTHESIS 803eac174f2Safresh1 ﹛ ﹜ U+FE5B, U+FE5C SMALL LEFT/RIGHT CURLY BRACKET 804eac174f2Safresh1 ﹝ ﹞ U+FE5D, U+FE5E SMALL LEFT/RIGHT TORTOISE SHELL BRACKET 805eac174f2Safresh1 ﹤ ﹥ U+FE64, U+FE65 SMALL LESS-THAN/GREATER-THAN SIGN 806eac174f2Safresh1 ( ) U+FF08, U+FF09 FULLWIDTH LEFT/RIGHT PARENTHESIS 807eac174f2Safresh1 < > U+FF1C, U+FF1E FULLWIDTH LESS-THAN/GREATER-THAN SIGN 808eac174f2Safresh1 [ ] U+FF3B, U+FF3D FULLWIDTH LEFT/RIGHT SQUARE BRACKET 809eac174f2Safresh1 { } U+FF5B, U+FF5D FULLWIDTH LEFT/RIGHT CURLY BRACKET 810eac174f2Safresh1 ⦅ ⦆ U+FF5F, U+FF60 FULLWIDTH LEFT/RIGHT WHITE PARENTHESIS 811eac174f2Safresh1 「 」 U+FF62, U+FF63 HALFWIDTH LEFT/RIGHT CORNER BRACKET 812eac174f2Safresh1 → ← U+FFEB, U+FFE9 HALFWIDTH RIGHT/LEFTWARDS ARROW 813eac174f2Safresh1 U+1D103, U+1D102 MUSICAL SYMBOL REVERSE FINAL BARLINE, MUSICAL 814eac174f2Safresh1 SYMBOL FINAL BARLINE 815eac174f2Safresh1 U+1D106, U+1D107 MUSICAL SYMBOL LEFT/RIGHT REPEAT SIGN 816eac174f2Safresh1 U+1F449, U+1F448 WHITE RIGHT/LEFT POINTING BACKHAND INDEX 817eac174f2Safresh1 U+1F508, U+1F568 SPEAKER, RIGHT SPEAKER 818eac174f2Safresh1 U+1F509, U+1F569 SPEAKER WITH ONE SOUND WAVE, RIGHT SPEAKER WITH 819eac174f2Safresh1 ONE SOUND WAVE 820eac174f2Safresh1 U+1F50A, U+1F56A SPEAKER WITH THREE SOUND WAVES, RIGHT SPEAKER 821eac174f2Safresh1 WITH THREE SOUND WAVES 822eac174f2Safresh1 U+1F57B, U+1F57D LEFT/RIGHT HAND TELEPHONE RECEIVER 823eac174f2Safresh1 U+1F599, U+1F598 SIDEWAYS WHITE RIGHT/LEFT POINTING INDEX 824eac174f2Safresh1 U+1F59B, U+1F59A SIDEWAYS BLACK RIGHT/LEFT POINTING INDEX 825eac174f2Safresh1 U+1F59D, U+1F59C BLACK RIGHT/LEFT POINTING BACKHAND INDEX 826eac174f2Safresh1 U+1F5E6, U+1F5E7 THREE RAYS LEFT/RIGHT 827eac174f2Safresh1 U+1F802, U+1F800 RIGHT/LEFTWARDS ARROW WITH SMALL TRIANGLE 828eac174f2Safresh1 ARROWHEAD 829eac174f2Safresh1 U+1F806, U+1F804 RIGHT/LEFTWARDS ARROW WITH MEDIUM TRIANGLE 830eac174f2Safresh1 ARROWHEAD 831eac174f2Safresh1 U+1F80A, U+1F808 RIGHT/LEFTWARDS ARROW WITH LARGE TRIANGLE 832eac174f2Safresh1 ARROWHEAD 833eac174f2Safresh1 U+1F812, U+1F810 RIGHT/LEFTWARDS ARROW WITH SMALL EQUILATERAL 834eac174f2Safresh1 ARROWHEAD 835eac174f2Safresh1 U+1F816, U+1F814 RIGHT/LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD 836eac174f2Safresh1 U+1F81A, U+1F818 HEAVY RIGHT/LEFTWARDS ARROW WITH EQUILATERAL 837eac174f2Safresh1 ARROWHEAD 838eac174f2Safresh1 U+1F81E, U+1F81C HEAVY RIGHT/LEFTWARDS ARROW WITH LARGE 839eac174f2Safresh1 EQUILATERAL ARROWHEAD 840eac174f2Safresh1 U+1F822, U+1F820 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH 841eac174f2Safresh1 NARROW SHAFT 842eac174f2Safresh1 U+1F826, U+1F824 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH 843eac174f2Safresh1 MEDIUM SHAFT 844eac174f2Safresh1 U+1F82A, U+1F828 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD 845eac174f2Safresh1 SHAFT 846eac174f2Safresh1 U+1F82E, U+1F82C RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH 847eac174f2Safresh1 HEAVY SHAFT 848eac174f2Safresh1 U+1F832, U+1F830 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY 849eac174f2Safresh1 HEAVY SHAFT 850eac174f2Safresh1 U+1F836, U+1F834 RIGHT/LEFTWARDS FINGER-POST ARROW 851eac174f2Safresh1 U+1F83A, U+1F838 RIGHT/LEFTWARDS SQUARED ARROW 852eac174f2Safresh1 U+1F83E, U+1F83C RIGHT/LEFTWARDS COMPRESSED ARROW 853eac174f2Safresh1 U+1F842, U+1F840 RIGHT/LEFTWARDS HEAVY COMPRESSED ARROW 854eac174f2Safresh1 U+1F846, U+1F844 RIGHT/LEFTWARDS HEAVY ARROW 855eac174f2Safresh1 U+1F852, U+1F850 RIGHT/LEFTWARDS SANS-SERIF ARROW 856eac174f2Safresh1 U+1F862, U+1F860 WIDE-HEADED RIGHT/LEFTWARDS LIGHT BARB ARROW 857eac174f2Safresh1 U+1F86A, U+1F868 WIDE-HEADED RIGHT/LEFTWARDS BARB ARROW 858eac174f2Safresh1 U+1F872, U+1F870 WIDE-HEADED RIGHT/LEFTWARDS MEDIUM BARB ARROW 859eac174f2Safresh1 U+1F87A, U+1F878 WIDE-HEADED RIGHT/LEFTWARDS HEAVY BARB ARROW 860eac174f2Safresh1 U+1F882, U+1F880 WIDE-HEADED RIGHT/LEFTWARDS VERY HEAVY BARB 861eac174f2Safresh1 ARROW 862eac174f2Safresh1 U+1F892, U+1F890 RIGHT/LEFTWARDS TRIANGLE ARROWHEAD 863eac174f2Safresh1 U+1F896, U+1F894 RIGHT/LEFTWARDS WHITE ARROW WITHIN TRIANGLE 864eac174f2Safresh1 ARROWHEAD 865eac174f2Safresh1 U+1F89A, U+1F898 RIGHT/LEFTWARDS ARROW WITH NOTCHED TAIL 866eac174f2Safresh1 U+1F8A1, U+1F8A0 RIGHTWARDS BOTTOM SHADED WHITE ARROW, 867eac174f2Safresh1 LEFTWARDS BOTTOM-SHADED WHITE ARROW 868eac174f2Safresh1 U+1F8A3, U+1F8A2 RIGHT/LEFTWARDS TOP SHADED WHITE ARROW 869eac174f2Safresh1 U+1F8A5, U+1F8A6 RIGHT/LEFTWARDS RIGHT-SHADED WHITE ARROW 870eac174f2Safresh1 U+1F8A7, U+1F8A4 RIGHT/LEFTWARDS LEFT-SHADED WHITE ARROW 871eac174f2Safresh1 U+1F8A9, U+1F8A8 RIGHT/LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW 872eac174f2Safresh1 U+1F8AB, U+1F8AA RIGHT/LEFTWARDS FRONT-TILTED SHADOWED WHITE 873eac174f2Safresh1 ARROW 874eac174f2Safresh1 875*e0680481Safresh1=head2 The 'module_true' feature 876*e0680481Safresh1 877*e0680481Safresh1This feature removes the need to return a true value at the end of a module 878*e0680481Safresh1loaded with C<require> or C<use>. Any errors during compilation will cause 879*e0680481Safresh1failures, but reaching the end of the module when this feature is in effect 880*e0680481Safresh1will prevent C<perl> from throwing an exception that the module "did not return 881*e0680481Safresh1a true value". 882*e0680481Safresh1 883*e0680481Safresh1=head2 The 'class' feature 884*e0680481Safresh1 885*e0680481Safresh1B<WARNING>: This feature is still experimental and the implementation may 886*e0680481Safresh1change or be removed in future versions of Perl. For this reason, Perl will 887*e0680481Safresh1warn when you use the feature, unless you have explicitly disabled the warning: 888*e0680481Safresh1 889*e0680481Safresh1 no warnings "experimental::class"; 890*e0680481Safresh1 891*e0680481Safresh1This feature enables the C<class> block syntax and other associated keywords 892*e0680481Safresh1which implement the "new" object system, previously codenamed "Corinna". 893*e0680481Safresh1 894850e2753Smillert=head1 FEATURE BUNDLES 895850e2753Smillert 896898184e3SsthenIt's possible to load multiple features together, using 897850e2753Smillerta I<feature bundle>. The name of a feature bundle is prefixed with 898898184e3Ssthena colon, to distinguish it from an actual feature. 899850e2753Smillert 900898184e3Ssthen use feature ":5.10"; 901898184e3Ssthen 902898184e3SsthenThe following feature bundles are available: 903898184e3Ssthen 904898184e3Ssthen bundle features included 905898184e3Ssthen --------- ----------------- 906eac174f2Safresh1 :default indirect multidimensional 907eac174f2Safresh1 bareword_filehandles 908898184e3Ssthen 909eac174f2Safresh1 :5.10 bareword_filehandles indirect 910eac174f2Safresh1 multidimensional say state switch 911898184e3Ssthen 912eac174f2Safresh1 :5.12 bareword_filehandles indirect 913eac174f2Safresh1 multidimensional say state switch 914eac174f2Safresh1 unicode_strings 915898184e3Ssthen 916eac174f2Safresh1 :5.14 bareword_filehandles indirect 917eac174f2Safresh1 multidimensional say state switch 918eac174f2Safresh1 unicode_strings 919898184e3Ssthen 920eac174f2Safresh1 :5.16 bareword_filehandles current_sub evalbytes 921eac174f2Safresh1 fc indirect multidimensional say state 922eac174f2Safresh1 switch unicode_eval unicode_strings 923898184e3Ssthen 924eac174f2Safresh1 :5.18 bareword_filehandles current_sub evalbytes 925eac174f2Safresh1 fc indirect multidimensional say state 926eac174f2Safresh1 switch unicode_eval unicode_strings 92791f110e0Safresh1 928eac174f2Safresh1 :5.20 bareword_filehandles current_sub evalbytes 929eac174f2Safresh1 fc indirect multidimensional say state 930eac174f2Safresh1 switch unicode_eval unicode_strings 9316fb12b70Safresh1 932eac174f2Safresh1 :5.22 bareword_filehandles current_sub evalbytes 933eac174f2Safresh1 fc indirect multidimensional say state 934eac174f2Safresh1 switch unicode_eval unicode_strings 935b8851fccSafresh1 936eac174f2Safresh1 :5.24 bareword_filehandles current_sub evalbytes 937eac174f2Safresh1 fc indirect multidimensional postderef_qq 938eac174f2Safresh1 say state switch unicode_eval 939eac174f2Safresh1 unicode_strings 940b8851fccSafresh1 941eac174f2Safresh1 :5.26 bareword_filehandles current_sub evalbytes 942eac174f2Safresh1 fc indirect multidimensional postderef_qq 943eac174f2Safresh1 say state switch unicode_eval 944eac174f2Safresh1 unicode_strings 9459f11ffb7Safresh1 946eac174f2Safresh1 :5.28 bareword_filehandles bitwise current_sub 947eac174f2Safresh1 evalbytes fc indirect multidimensional 948eac174f2Safresh1 postderef_qq say state switch unicode_eval 949eac174f2Safresh1 unicode_strings 9509f11ffb7Safresh1 951eac174f2Safresh1 :5.30 bareword_filehandles bitwise current_sub 952eac174f2Safresh1 evalbytes fc indirect multidimensional 953eac174f2Safresh1 postderef_qq say state switch unicode_eval 954eac174f2Safresh1 unicode_strings 95556d68f1eSafresh1 956eac174f2Safresh1 :5.32 bareword_filehandles bitwise current_sub 957eac174f2Safresh1 evalbytes fc indirect multidimensional 958eac174f2Safresh1 postderef_qq say state switch unicode_eval 959eac174f2Safresh1 unicode_strings 960eac174f2Safresh1 961eac174f2Safresh1 :5.34 bareword_filehandles bitwise current_sub 962eac174f2Safresh1 evalbytes fc indirect multidimensional 963eac174f2Safresh1 postderef_qq say state switch unicode_eval 964eac174f2Safresh1 unicode_strings 965eac174f2Safresh1 966eac174f2Safresh1 :5.36 bareword_filehandles bitwise current_sub 967eac174f2Safresh1 evalbytes fc isa postderef_qq say signatures 968eac174f2Safresh1 state unicode_eval unicode_strings 969b46d8ef2Safresh1 970*e0680481Safresh1 :5.38 bitwise current_sub evalbytes fc isa 971*e0680481Safresh1 module_true postderef_qq say signatures 972*e0680481Safresh1 state unicode_eval unicode_strings 973*e0680481Safresh1 974898184e3SsthenThe C<:default> bundle represents the feature set that is enabled before 975898184e3Ssthenany C<use feature> or C<no feature> declaration. 976898184e3Ssthen 977898184e3SsthenSpecifying sub-versions such as the C<0> in C<5.14.0> in feature bundles has 978898184e3Ssthenno effect. Feature bundles are guaranteed to be the same for all sub-versions. 979898184e3Ssthen 980898184e3Ssthen use feature ":5.14.0"; # same as ":5.14" 981898184e3Ssthen use feature ":5.14.1"; # same as ":5.14" 982850e2753Smillert 983850e2753Smillert=head1 IMPLICIT LOADING 984850e2753Smillert 985898184e3SsthenInstead of loading feature bundles by name, it is easier to let Perl do 986898184e3Ssthenimplicit loading of a feature bundle for you. 987898184e3Ssthen 988850e2753SmillertThere are two ways to load the C<feature> pragma implicitly: 989850e2753Smillert 990850e2753Smillert=over 4 991850e2753Smillert 992850e2753Smillert=item * 993850e2753Smillert 994898184e3SsthenBy using the C<-E> switch on the Perl command-line instead of C<-e>. 995898184e3SsthenThat will enable the feature bundle for that version of Perl in the 996898184e3Ssthenmain compilation unit (that is, the one-liner that follows C<-E>). 997850e2753Smillert 998850e2753Smillert=item * 999850e2753Smillert 1000898184e3SsthenBy explicitly requiring a minimum Perl version number for your program, with 1001898184e3Ssthenthe C<use VERSION> construct. That is, 1002850e2753Smillert 1003*e0680481Safresh1 use v5.36.0; 1004850e2753Smillert 1005850e2753Smillertwill do an implicit 1006850e2753Smillert 1007898184e3Ssthen no feature ':all'; 1008*e0680481Safresh1 use feature ':5.36'; 1009850e2753Smillert 1010898184e3Ssthenand so on. Note how the trailing sub-version 1011898184e3Ssthenis automatically stripped from the 101243003dfeSmillertversion. 1013850e2753Smillert 1014850e2753SmillertBut to avoid portability warnings (see L<perlfunc/use>), you may prefer: 1015850e2753Smillert 1016*e0680481Safresh1 use 5.036; 1017850e2753Smillert 1018850e2753Smillertwith the same effect. 1019850e2753Smillert 1020898184e3SsthenIf the required version is older than Perl 5.10, the ":default" feature 1021898184e3Ssthenbundle is automatically loaded instead. 1022898184e3Ssthen 10239f11ffb7Safresh1Unlike C<use feature ":5.12">, saying C<use v5.12> (or any higher version) 10249f11ffb7Safresh1also does the equivalent of C<use strict>; see L<perlfunc/use> for details. 10259f11ffb7Safresh1 1026850e2753Smillert=back 1027850e2753Smillert 1028eac174f2Safresh1=head1 CHECKING FEATURES 1029eac174f2Safresh1 1030eac174f2Safresh1C<feature> provides some simple APIs to check which features are enabled. 1031eac174f2Safresh1 1032eac174f2Safresh1These functions cannot be imported and must be called by their fully 1033eac174f2Safresh1qualified names. If you don't otherwise need to set a feature you will 1034eac174f2Safresh1need to ensure C<feature> is loaded with: 1035eac174f2Safresh1 1036eac174f2Safresh1 use feature (); 1037eac174f2Safresh1 1038eac174f2Safresh1=over 1039eac174f2Safresh1 1040eac174f2Safresh1=item feature_enabled($feature) 1041eac174f2Safresh1 1042eac174f2Safresh1=item feature_enabled($feature, $depth) 1043eac174f2Safresh1 1044eac174f2Safresh1 package MyStandardEnforcer; 1045eac174f2Safresh1 use feature (); 1046eac174f2Safresh1 use Carp "croak"; 1047eac174f2Safresh1 sub import { 1048eac174f2Safresh1 croak "disable indirect!" if feature::feature_enabled("indirect"); 1049eac174f2Safresh1 } 1050eac174f2Safresh1 1051eac174f2Safresh1Test whether a named feature is enabled at a given level in the call 1052eac174f2Safresh1stack, returning a true value if it is. C<$depth> defaults to 1, 1053eac174f2Safresh1which checks the scope that called the scope calling 1054eac174f2Safresh1feature::feature_enabled(). 1055eac174f2Safresh1 1056eac174f2Safresh1croaks for an unknown feature name. 1057eac174f2Safresh1 1058eac174f2Safresh1=item features_enabled() 1059eac174f2Safresh1 1060eac174f2Safresh1=item features_enabled($depth) 1061eac174f2Safresh1 1062eac174f2Safresh1 package ReportEnabledFeatures; 1063eac174f2Safresh1 use feature "say"; 1064eac174f2Safresh1 sub import { 1065eac174f2Safresh1 say STDERR join " ", feature::features_enabled(); 1066eac174f2Safresh1 } 1067eac174f2Safresh1 1068eac174f2Safresh1Returns a list of the features enabled at a given level in the call 1069eac174f2Safresh1stack. C<$depth> defaults to 1, which checks the scope that called 1070eac174f2Safresh1the scope calling feature::features_enabled(). 1071eac174f2Safresh1 1072eac174f2Safresh1=item feature_bundle() 1073eac174f2Safresh1 1074eac174f2Safresh1=item feature_bundle($depth) 1075eac174f2Safresh1 1076eac174f2Safresh1Returns the feature bundle, if any, selected at a given level in the 1077eac174f2Safresh1call stack. C<$depth> defaults to 1, which checks the scope that called 1078eac174f2Safresh1the scope calling feature::feature_bundle(). 1079eac174f2Safresh1 1080eac174f2Safresh1Returns an undefined value if no feature bundle is selected in the 1081eac174f2Safresh1scope. 1082eac174f2Safresh1 1083eac174f2Safresh1The bundle name returned will be for the earliest bundle matching the 1084eac174f2Safresh1selected bundle, so: 1085eac174f2Safresh1 1086eac174f2Safresh1 use feature (); 1087eac174f2Safresh1 use v5.12; 1088eac174f2Safresh1 BEGIN { print feature::feature_bundle(0); } 1089eac174f2Safresh1 1090eac174f2Safresh1will print C<5.11>. 1091eac174f2Safresh1 1092eac174f2Safresh1This returns internal state, at this point C<use v5.12;> sets the 1093eac174f2Safresh1feature bundle, but C< use feature ":5.12"; > does not set the feature 1094eac174f2Safresh1bundle. This may change in a future release of perl. 1095eac174f2Safresh1 1096eac174f2Safresh1=back 1097eac174f2Safresh1 1098850e2753Smillert=cut 1099850e2753Smillert 1100850e2753Smillertsub import { 1101b8851fccSafresh1 shift; 1102898184e3Ssthen 1103898184e3Ssthen if (!@_) { 1104850e2753Smillert croak("No features specified"); 1105850e2753Smillert } 1106898184e3Ssthen 1107898184e3Ssthen __common(1, @_); 1108898184e3Ssthen} 1109898184e3Ssthen 1110898184e3Ssthensub unimport { 1111b8851fccSafresh1 shift; 1112898184e3Ssthen 1113898184e3Ssthen # A bare C<no feature> should reset to the default bundle 1114898184e3Ssthen if (!@_) { 1115898184e3Ssthen $^H &= ~($hint_uni8bit|$hint_mask); 1116898184e3Ssthen return; 1117898184e3Ssthen } 1118898184e3Ssthen 1119898184e3Ssthen __common(0, @_); 1120898184e3Ssthen} 1121898184e3Ssthen 1122898184e3Ssthen 1123898184e3Ssthensub __common { 1124898184e3Ssthen my $import = shift; 1125898184e3Ssthen my $bundle_number = $^H & $hint_mask; 1126898184e3Ssthen my $features = $bundle_number != $hint_mask 1127898184e3Ssthen && $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]}; 1128898184e3Ssthen if ($features) { 1129898184e3Ssthen # Features are enabled implicitly via bundle hints. 1130898184e3Ssthen # Delete any keys that may be left over from last time. 1131898184e3Ssthen delete @^H{ values(%feature) }; 1132898184e3Ssthen $^H |= $hint_mask; 1133898184e3Ssthen for (@$features) { 1134898184e3Ssthen $^H{$feature{$_}} = 1; 1135898184e3Ssthen $^H |= $hint_uni8bit if $_ eq 'unicode_strings'; 1136898184e3Ssthen } 1137898184e3Ssthen } 1138850e2753Smillert while (@_) { 1139898184e3Ssthen my $name = shift; 1140850e2753Smillert if (substr($name, 0, 1) eq ":") { 1141850e2753Smillert my $v = substr($name, 1); 1142850e2753Smillert if (!exists $feature_bundle{$v}) { 114343003dfeSmillert $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/; 114443003dfeSmillert if (!exists $feature_bundle{$v}) { 114543003dfeSmillert unknown_feature_bundle(substr($name, 1)); 114643003dfeSmillert } 1147850e2753Smillert } 1148850e2753Smillert unshift @_, @{$feature_bundle{$v}}; 1149850e2753Smillert next; 1150850e2753Smillert } 1151850e2753Smillert if (!exists $feature{$name}) { 11529f11ffb7Safresh1 if (exists $noops{$name}) { 11539f11ffb7Safresh1 next; 11549f11ffb7Safresh1 } 1155b46d8ef2Safresh1 if (!$import && exists $removed{$name}) { 1156b46d8ef2Safresh1 next; 1157b46d8ef2Safresh1 } 1158850e2753Smillert unknown_feature($name); 1159850e2753Smillert } 1160898184e3Ssthen if ($import) { 1161850e2753Smillert $^H{$feature{$name}} = 1; 1162b39c5158Smillert $^H |= $hint_uni8bit if $name eq 'unicode_strings'; 1163898184e3Ssthen } else { 1164850e2753Smillert delete $^H{$feature{$name}}; 1165b39c5158Smillert $^H &= ~ $hint_uni8bit if $name eq 'unicode_strings'; 1166850e2753Smillert } 1167850e2753Smillert } 1168850e2753Smillert} 1169850e2753Smillert 1170850e2753Smillertsub unknown_feature { 1171850e2753Smillert my $feature = shift; 1172850e2753Smillert croak(sprintf('Feature "%s" is not supported by Perl %vd', 1173850e2753Smillert $feature, $^V)); 1174850e2753Smillert} 1175850e2753Smillert 1176850e2753Smillertsub unknown_feature_bundle { 1177850e2753Smillert my $feature = shift; 1178850e2753Smillert croak(sprintf('Feature bundle "%s" is not supported by Perl %vd', 1179850e2753Smillert $feature, $^V)); 1180850e2753Smillert} 1181850e2753Smillert 1182850e2753Smillertsub croak { 1183850e2753Smillert require Carp; 1184850e2753Smillert Carp::croak(@_); 1185850e2753Smillert} 1186850e2753Smillert 1187eac174f2Safresh1sub features_enabled { 1188eac174f2Safresh1 my ($depth) = @_; 1189eac174f2Safresh1 1190eac174f2Safresh1 $depth //= 1; 1191eac174f2Safresh1 my @frame = caller($depth+1) 1192eac174f2Safresh1 or return; 1193eac174f2Safresh1 my ($hints, $hinthash) = @frame[8, 10]; 1194eac174f2Safresh1 1195eac174f2Safresh1 my $bundle_number = $hints & $hint_mask; 1196eac174f2Safresh1 if ($bundle_number != $hint_mask) { 1197eac174f2Safresh1 return $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]}->@*; 1198eac174f2Safresh1 } 1199eac174f2Safresh1 else { 1200eac174f2Safresh1 my @features; 1201eac174f2Safresh1 for my $feature (sort keys %feature) { 1202eac174f2Safresh1 if ($hinthash->{$feature{$feature}}) { 1203eac174f2Safresh1 push @features, $feature; 1204eac174f2Safresh1 } 1205eac174f2Safresh1 } 1206eac174f2Safresh1 return @features; 1207eac174f2Safresh1 } 1208eac174f2Safresh1} 1209eac174f2Safresh1 1210eac174f2Safresh1sub feature_enabled { 1211eac174f2Safresh1 my ($feature, $depth) = @_; 1212eac174f2Safresh1 1213eac174f2Safresh1 $depth //= 1; 1214eac174f2Safresh1 my @frame = caller($depth+1) 1215eac174f2Safresh1 or return; 1216eac174f2Safresh1 my ($hints, $hinthash) = @frame[8, 10]; 1217eac174f2Safresh1 1218eac174f2Safresh1 my $hint_feature = $feature{$feature} 1219eac174f2Safresh1 or croak "Unknown feature $feature"; 1220eac174f2Safresh1 my $bundle_number = $hints & $hint_mask; 1221eac174f2Safresh1 if ($bundle_number != $hint_mask) { 1222eac174f2Safresh1 my $bundle = $hint_bundles[$bundle_number >> $hint_shift]; 1223eac174f2Safresh1 for my $bundle_feature ($feature_bundle{$bundle}->@*) { 1224eac174f2Safresh1 return 1 if $bundle_feature eq $feature; 1225eac174f2Safresh1 } 1226eac174f2Safresh1 return 0; 1227eac174f2Safresh1 } 1228eac174f2Safresh1 else { 1229eac174f2Safresh1 return $hinthash->{$hint_feature} // 0; 1230eac174f2Safresh1 } 1231eac174f2Safresh1} 1232eac174f2Safresh1 1233eac174f2Safresh1sub feature_bundle { 1234eac174f2Safresh1 my $depth = shift; 1235eac174f2Safresh1 1236eac174f2Safresh1 $depth //= 1; 1237eac174f2Safresh1 my @frame = caller($depth+1) 1238eac174f2Safresh1 or return; 1239eac174f2Safresh1 my $bundle_number = $frame[8] & $hint_mask; 1240eac174f2Safresh1 if ($bundle_number != $hint_mask) { 1241eac174f2Safresh1 return $hint_bundles[$bundle_number >> $hint_shift]; 1242eac174f2Safresh1 } 1243eac174f2Safresh1 else { 1244eac174f2Safresh1 return undef; 1245eac174f2Safresh1 } 1246eac174f2Safresh1} 1247eac174f2Safresh1 1248850e2753Smillert1; 1249898184e3Ssthen 1250*e0680481Safresh1# ex: set ro ft=perl: 1251