File Coverage

blib/lib/Syntax/Construct.pm
Criterion Covered Total %
statement 43 52 82.6
branch 25 34 73.5
condition 5 9 55.5
subroutine 11 13 84.6
pod 2 2 100.0
total 86 110 78.1


line stmt bran cond sub pod time code
1             package Syntax::Construct;
2              
3 7     7   353682 use 5.006002;
  7         68  
4 7     7   35 use strict;
  7         13  
  7         165  
5 7     7   43 use warnings;
  7         13  
  7         363  
6              
7             our $VERSION = '1.033';
8              
9 7     7   43 my %introduces = do { no warnings 'qw';
  7         12  
  7         3759  
10             ( '5.038' => [qw[
11             unicode15.0 ^HOOK signature-default-operator
12             INCDIR *{} REG_INF_I32_MAX
13             ^LAST_SUCCESSFUL_PATTERN
14             ]],
15             '5.036' => [qw[
16             unicode14.0
17             ]],
18             '5.034' => [qw[
19             {,n} 0o blanks-in-curlies
20             ]],
21             '5.032' => [qw[
22             unicode13.0 chained-comparisons
23             unicode-identifier-status
24             unicode-name-property
25             ]],
26             '5.030' => [qw[
27             unicode12.1 uniprop_wildcards qr'N
28             turkic-casing ^RE_COMPILE_RECURSION_LIMIT
29             ]],
30             '5.028' => [qw[
31             delete% unicode10.0 state@=
32             ]],
33             '5.026' => [qw[
34             <<~ /xx ^CAPTURE unicode9.0 unicode-scx scalar%
35             ]],
36             '5.024' => [qw[
37             unicode8.0 \b{lb} sprintf-reorder
38             ]],
39             '5.022' => [qw[
40             <<>> \b{} /n unicode7.0 attr-const
41             fileno-dir ()x= hexfloat chr-inf
42             empty-slice /x-unicode
43             ]],
44             '5.020' => [qw[
45             attr-prototype drand48 %slice
46             unicode6.3 \p{Unicode} utf8-locale
47             s-utf8-delimiters
48             ]],
49             '5.018' => [qw[
50             computed-labels while-each method-on-any-string
51             ]],
52             '5.016' => [qw[
53             charnames
54             ]],
55             '5.014' => [qw[
56             ?^ /r /d /l /u /a auto-deref
57             ^GLOBAL_PHASE \o package-block
58             srand-return prototype+
59             ]],
60             '5.012' => [qw[
61             package-version ... each-array
62             keys-array values-array delete-local
63             length-undef \N while-readdir
64             ]],
65             '5.010' => [qw[
66             // ?PARNO ?<> ?| quant+ regex-verbs
67             \K \R \v \h \gN readline()
68             stack-file-test recursive-sort /p
69             lexical-$_ pack<
70             ]],
71             '5.008001' => [qw[
72             s-utf8-delimiters-hack
73             ]],
74             old => [qw[
75             ?? for-qw @_=split no-sigil
76             ]],
77             )};
78              
79             my %removed = ( 'auto-deref' => '5.024',
80             'lexical-$_' => '5.024',
81             '??' => '5.022',
82             'no-sigil' => '5.022',
83             's-utf8-delimiters-hack' => '5.020',
84             'for-qw' => '5.018',
85             '@_=split' => '5.012',
86             );
87              
88             my %alias = (
89             # old
90             'split-populates-@_' => '@_=split',
91             # 5.010
92             '\H' => '\h',
93             '\V' => '\v',
94             'defined-or' => '//',
95             'lexical-default-variable' => 'lexical-$_',
96             'pack-byte-order-modifiers' => 'pack<',
97             'readline-argv' => 'readline()',
98             'regex-generic-linebreak' => '\R',
99             'regex-horizontal-whitespace' => '\h',
100             'regex-keep-left' => '\K',
101             'regex-named-capture-group' => '?<>',
102             'regex-possessive-quantifier' => 'quant+',
103             'regex-possessive-match' => 'quant+',
104             'regex-preserve-match-captures' => '/p',
105             'regex-recursive-subpattern' => '?PARNO',
106             'regex-relative-backreference' => '\gN',
107             'regex-reset-branch' => '?|',
108             'regex-vertical-whitespace' => '\v',
109             # 5.012
110             'statement-ellipsis' => '...',
111             'yada-yada' => '...',
112             'triple-dot' => '...',
113             'regex-non-newline' => '\N',
114             # 5.014
115             'non-destructive-subst' => '/r',
116             'non-destructive-substitution' => '/r',
117             'regex-restrict-ascii-range' => '/a',
118             'regex-unicode-strings' => '/u',
119             'regex-use-default-modifiers' => '?^',
120             'regex-compile-as-default' => '/d',
121             'regex-compile-as-locale' => '/l',
122             'regex-compile-as-unicode-strings' => '/u',
123             'global-phase' => '^GLOBAL_PHASE',
124             'octal-escape' => '\o',
125             # 5.020
126             'hash-slice' => '%slice',
127             'attribute-prototype' => 'attr-prototype',
128             'regex-property-unicode' => '\p{Unicode}',
129             'wide-char-delimiters' => 's-utf8-delimiters',
130             'unicode-6.3' => 'unicode6.3',
131             # 5.022
132             'double-diamond' => '<<>>',
133             'operator-double-diamond' => '<<>>',
134             'regex-non-capturing' => '/n',
135             '\b{gcb}' => '\b{}',
136             '\b{wb}' => '\b{}',
137             '\b{sb}' => '\b{}',
138             'regex-unicode-boundary' => '\b{}',
139             'regex-unicode-grapheme-cluster-boundary' => '\b{}',
140             'regex-unicode-word-boundary' => '\b{}',
141             'regex-unicode-sentence-boundary' => '\b{}',
142             'attribute-const' => 'attr-const',
143             'list-repetition-assignment' => '()x=',
144             'hexadecimal-floating-numbers' => 'hexfloat',
145             'pack-inf' => 'chr-inf',
146             'regex-x-unicode' => '/x-unicode',
147             'regex-x-handles-unicode' => '/x-unicode',
148             'unicode-7.0' => 'unicode7.0',
149             # 5.024
150             'unicode-8.0' => 'unicode8.0',
151             'regex-unicode-line-break-boundary' => '\b{lb}',
152             'printf-precision-argument-reorder' => 'sprintf-reorder',
153             'sprintf-precision-argument-reorder' => 'sprintf-reorder',
154             # 5.026
155             'unicode-9.0' => 'unicode9.0',
156             'heredoc-indent' => '<<~',
157             'regex-xx' => '/xx',
158             'capture-variable' => '^CAPTURE',
159             'scalar-hash' => 'scalar%',
160             # 5.028
161             'hash-delete-slice' => 'delete%',
162             'unicode-10.0' => 'unicode10.0',
163             'state-array' => 'state@=',
164             'state-hash' => 'state@=',
165             'list-context-state' => 'state@=',
166             # 5.030
167             'named-char-in-single-quoted-regex' => "qr'N",
168             'unicode-12.1' => 'unicode12.1',
169             're-compile-recursion-limit' => '^RE_COMPILE_RECURSION_LIMIT',
170             # 5.032
171             'unicode-13.0' => 'unicode13.0',
172             'unicode-identifier-type' => 'unicode-identifier-status',
173             # 5.034
174             'empty-left-quantifier' => '{,n}',
175             'octal-literals' => '0o',
176             # 5.038
177             'keyword-hook' => '^HOOK',
178             'optimistic-eval' => '*{}',
179             );
180              
181             my %_introduced = map {
182             my $version = $_;
183             map { $_ => $version } @{ $introduces{$version} }
184             } keys %introduces;
185              
186             my %introduced = %_introduced;
187             delete @introduced{ @{ $introduces{old} } };
188              
189             sub _hook {
190             { drand48 => sub {
191 1     1   8 require Config;
192             warn "Unknown rand implementation at ", _position(1), ".\n"
193 1 50       111 unless 'Perl_drand48' eq $Config::Config{randfunc};
194             },
195             'turkic-casing' => sub {
196 0 0   0   0 eval {
197 7     7   3343 use locale;
  7         4262  
  7         38  
198 0         0 require POSIX;
199 0         0 POSIX::setlocale(POSIX::LC_ALL(), 'tr_TR.UTF-8');
200 0         0 lc 'I' ne 'i'
201             } or die 'Turkic locale casing not working at '
202             . _position(1) . "\.\n";
203             },
204             }
205 95     95   716 }
206              
207              
208             sub removed {
209 94     94 1 219355 my $construct = shift;
210             return $construct
211             ? $removed{$construct}
212 94 100 66     573 || $alias{$construct} && $removed{ $alias{$construct} }
213             : keys %removed
214             }
215              
216              
217             sub introduced {
218 5     5 1 172 my $construct = shift;
219             return $construct
220             ? $introduced{$construct}
221 5 100 66     57 || $alias{$construct} && $introduced{ $alias{$construct} }
222             : keys %introduced
223             }
224              
225              
226             sub _position {
227 33     33   493 join ' line ', (caller(1 + !! shift))[1,2]
228             }
229              
230              
231             sub import {
232 98     98   2853 shift;
233 98         161 my $min_version = 0;
234 98         138 my $max_version = 6;
235 98         273 my ($constr, $d_constr);
236 98         0 my @actions;
237 98         200 for my $name (@_) {
238 97 100       260 local $_ = exists $alias{$name} ? $alias{$name} : $name;
239 97 100       299 if ($introduced{$_}) {
    100          
240             ($min_version, $constr) = ($introduced{$_}, $name)
241 92 50       331 if $introduced{$_} gt $min_version;
242             } elsif (! $removed{$_}) {
243 1         6 die "Unknown construct `$name' at ",
244             _position(),
245             ". Try upgrading Syntax::Construct first.\n"
246             }
247              
248 96 100       283 if ($removed{$_}) {
249             ($max_version, $d_constr) = ($removed{$_}, $name)
250 7 50       40 if $removed{$_} lt $max_version;
251             }
252              
253 96         193 my $action = _hook()->{$_};
254 96 100       660 push @actions, $action if $action;
255             }
256 97 100       227 die 'Empty construct list at ', _position(), ".\n" unless @_;
257              
258             my $nearest_stable = ( my $is_stable = $] =~ /^[0-5]\.[0-9][0-9][02468]/ )
259             ? $]
260 96 50       556 : do {
261 0         0 my ($major, $minor)
262             = $] =~ /^([0-5])\.([0-9][0-9][13579])/;
263 0         0 ++$minor;
264 0         0 "$major.$minor"
265             };
266 96 100       224 if ($max_version le $nearest_stable) {
267 7 50 33     26 warn "Faking version $nearest_stable to test removed constructs.\n"
268             if ! $is_stable && $max_version eq $nearest_stable;
269 7         26 die "$d_constr removed in $max_version at ", _position(), ".\n";
270             }
271              
272 89 100       227 die "Unsupported construct $constr at ", _position(),
273             sprintf " (Perl %s needed)\n", $min_version
274             unless $min_version le $];
275              
276 65         207 $_->() for @actions;
277             }
278              
279 0 0   0     sub _is_old_empty { @{ $introduces{old} } ? 0 : 1 }
  0            
280              
281             =head1 NAME
282              
283             Syntax::Construct - Explicitly state which non-feature constructs are used in the code.
284              
285             =head1 VERSION
286              
287             Version 1.033
288              
289             =head1 SYNOPSIS
290              
291             For some new syntactic constructs, there is the L pragma. For
292             the rest, there is B.
293              
294             use Syntax::Construct qw( // ... /r );
295              
296             my $x = shift // 'default';
297             my $y = $x =~ s/de(fault)/$1/r;
298             if ($y =~ /^fault/) {
299             ...
300             }
301              
302             There are two subroutines (not exported) which you can use to query
303             the lists of constructs programmatically: C and
304             C (see below).
305              
306             my @constructs = Syntax::Construct::introduced();
307             say "$_ was introduced in ",
308             Syntax::Construct::introduced($_) for @constructs;
309              
310             =head1 DESCRIPTION
311              
312             This module provides a simple way of specifying syntactic constructs
313             that are not implemented via the L pragma, but are still not
314             compatible with older versions of Perl.
315              
316             It's the programmer's responsibility to track the constructs and list
317             them (but see L on how to extract the
318             information from existing code).
319              
320             Using C doesn't really change
321             anything if you're running Perl 5.010+, but it gives much better error
322             messages in older versions:
323              
324             Unsupported construct //
325              
326             instead of
327              
328             Search pattern not terminated
329              
330             Three groups of people can benefit from the module:
331              
332             =over 4
333              
334             =item 1.
335              
336             The authors of the module using L win, as they have
337             all the constructs in one place (i.e. L's
338             documentation) and they don't waste their time searching through
339             perldeltas and other places.
340              
341             =item 2.
342              
343             Users of their modules win as they get meaningful error messages
344             telling them which Perl version they need to upgrade to.
345              
346             =item 3.
347              
348             The programmer they hired to work around the problem wins as they know
349             what constructs to replace in the code to make it run in the ancient
350             version.
351              
352             =back
353              
354             =head2 Good Practice
355              
356             Some programmers just use all the I their current Perl
357             version provides without any notice. This leads to weird error
358             messages in older Perl versions.
359              
360             Some other programmers will place C towards the top of the
361             script, even if the only I they use is the C operator
362             available in 5.010 already. This prevents users of older versions of
363             Perl to run the script, even if it would otherwise be easily possible.
364              
365             The kindest programmers will add C towards the top of
366             the script. But it means they have to remember or find out what
367             version introduced the I they use.
368              
369             B liberates you from the need to remember all the
370             I together with Perl versions that introduced them. It
371             makes it easier for users of older Perl versions to migrate your code
372             to their system. And finally, it improves the error messages they get.
373              
374             Similarly, it's a good practice to keep specifying C
375             postderef };> even if it's a no-op since 5.024: it makes your script
376             available for people running older Perl versions. The same applies to
377             C in 5.016 and later, etc.
378              
379             =head1 EXPORT
380              
381             Nothing. Using B with no parameters is an error,
382             giving it an empty list is a no-op (but you can then access the
383             C and C subroutines).
384              
385             =over 4
386              
387             =item introduced
388              
389             Without arguments, returns a list of all the supported
390             constructs. With an argument, returns the version in which the given
391             construct was introduced.
392              
393             =item removed
394              
395             Same as C, but for removed constructs (e.g. auto-deref in
396             5.024).
397              
398             =back
399              
400             =head1 RECOGNISED CONSTRUCTS
401              
402             =head2 5.008001
403              
404             =head3 s-utf8-delimiters-hack
405              
406             See L. The hack doesn't seem to work in 5.008
407             and older. Removed in 5.020.
408              
409             =head2 5.010
410              
411             =head3 recursive-sort
412              
413             L.
414              
415             =head3 //
416              
417             L or L.
418              
419             Alias: defined-or
420              
421             =head3 ?PARNO
422              
423             "Recursive Patterns" under L or
424             L.
425              
426             Alias: regex-recursive-subpattern
427              
428             =head3 ?<>
429              
430             "Named Capture Buffers" under L or
431             LNAMEE<62>pattern)">.
432              
433             Alias: regex-named-capture-group
434              
435             =head3 ?|
436              
437             Not mentioned in any Delta. See B<(?|pattern)> in L.
438              
439             Alias: regex-reset-branch
440              
441             =head3 quant+
442              
443             "Possessive Quantifiers" under L or
444             L.
445              
446             Aliases: regex-possessive-quantifier regex-possessive-match
447              
448             =head3 regex-verbs
449              
450             "Backtracking control verbs" under L
451             expressions> or L.
452              
453              
454             =head3 \K
455              
456             "\K escape" under L or
457             L.
458              
459             Alias: regex-keep-left
460              
461             =head3 \R \v \h
462              
463             Covers C<\V> and C<\H>, too. See "Vertical and horizontal whitespace,
464             and linebreak" under L or
465             L.
466              
467             Aliases: \H \V regex-generic-linebreak regex-horizontal-whitespace regex-vertical-whitespace
468              
469             =head3 \gN
470              
471             "Relative backreferences" under L or
472             L.
473              
474             Alias: regex-relative-backreference
475              
476             =head3 readline()
477              
478             L.
479              
480             Alias: readline-argv
481              
482             =head3 stack-file-test
483              
484             L.
485              
486             =head3 /p
487              
488             C

(preserve) modifier and C<${^PREMATCH}>, C<${^MATCH}> and
489             C<${^POSTMATCH}> variables. Not mentioned in any Delta. See
490             L.
491              
492             Alias: regex-preserve-match-captures
493              
494             =head3 lexical-$_
495              
496             L. Removed in 5.024.
497              
498             Alias: lexical-default-variable
499              
500             =head3 pack<
501              
502             See L
503              
504             Alias: pack-byte-order-modifiers
505              
506             =head2 5.012
507              
508             =head3 package-version
509              
510             L
511              
512             =head3 ...
513              
514             L or L
515              
516             Aliases: yada-yada triple-dot statement-ellipsis
517              
518             =head3 each-array
519              
520             L
521              
522             =head3 keys-array
523              
524             L
525              
526             =head3 values-array
527              
528             L
529              
530             =head3 delete-local
531              
532             L
533              
534             =head3 length-undef
535              
536             See the ninth bullet in L
537             changes>.
538              
539             =head3 \N
540              
541             L.
542              
543             Alias: regex-non-newline
544              
545             =head3 while-readdir
546              
547             C in a while-loop condition populates C<$_>. Not mentioned in
548             any delta, but see C in L.
549              
550             =head2 5.014
551              
552             =head3 ?^
553              
554             L.
555              
556             Alias: regex-use-default-modifiers
557              
558             =head3 /r
559              
560             L and L.
561              
562             Aliases: non-destructive-subst non-destructive-substitution
563              
564             =head3 /d
565              
566             L and L.
567              
568             Alias: regex-compile-as-default
569              
570             =head3 /l
571              
572             L and L.
573              
574             Alias: regex-compile-as-locale
575              
576             =head3 /u
577              
578             L and L.
579              
580             Aliases: regex-unicode-strings regex-compile-as-unicode-strings
581              
582             =head3 /a
583              
584             L and L.
585              
586             Alias: regex-restrict-ascii-range
587              
588             =head3 auto-deref
589              
590             L
591             references>. See also C, C, C, C,
592             C, C, C, and C in L.
593             Removed in 5.024.
594              
595             =head3 ^GLOBAL_PHASE
596              
597             See B under
598             L.
599              
600             Alias: global-phase
601              
602             =head3 \o
603              
604             L.
605              
606             Alias: octal-escape
607              
608             =head3 package-block
609              
610             See B under L.
611              
612             =head3 srand-return
613              
614             See B under L.
615              
616             =head3 prototype+
617              
618             See L.
619              
620             =head2 5.016
621              
622             =head3 charnames
623              
624             See L.
625              
626             =head2 5.018
627              
628             =head3 computed-labels
629              
630             L
631              
632             =head3 while-each
633              
634             See in L or C in L.
635              
636             =head3 method-on-any-string
637              
638             See [perl #105922] in L.
639              
640             =head2 5.020
641              
642             =head3 attr-prototype
643              
644             L
645              
646             Alias: attribute-prototype
647              
648             =head3 drand48
649              
650             L.
651             Note that on OpenBSD, Perl 5.020+ uses the system's own C
652             unless seeded.
653              
654             =head3 %slice
655              
656             L
657              
658             Alias: hash-slice
659              
660             =head3 unicode6.3
661              
662             L
663              
664             Alias: unicode-6.3
665              
666             =head3 \p{Unicode}
667              
668             See B in
669             L.
670              
671             Alias: regex-property-unicode
672              
673             =head3 utf8-locale
674              
675             See B in
676             L.
677              
678             =head3 s-utf8-delimiters
679              
680             See L: in older Perl versions, a
681             hack around was possible: to specify the delimiter twice in
682             substitution. Use C if your code uses it.
683              
684             Alias: wide-char-delimiters
685              
686             =head2 5.022
687              
688             =head3 <<>>
689              
690             L
691              
692             Aliases: double-diamond operator-double-diamond
693              
694             =head3 \b{}
695              
696             L
697              
698             Aliases: regex-unicode-grapheme-cluster-boundary regex-unicode-boundary regex-unicode-word-boundary regex-unicode-sentence-boundary regex-unicode-line-break-boundary \b{sb} \b{wb} \b{gcb}
699              
700             =head3 /n
701              
702             L
703              
704             Alias: regex-non-capturing
705              
706             =head3 unicode7.0
707              
708             See B in
709             L.
710              
711             Alias: unicode-7.0
712              
713             =head3 attr-const
714              
715             L
716              
717             Alias: attribute-const
718              
719             =head3 fileno-dir
720              
721             L
722              
723             =head3 ()x=
724              
725             L
726              
727             Alias: list-repetition-assignment
728              
729             =head3 hexfloat
730              
731             L
732              
733             Alias: hexadecimal-floating-numbers
734              
735             =head3 chr-inf
736              
737             L
738              
739             Alias: pack-inf
740              
741             =head3 empty-slice
742              
743             L
744              
745             =head3 /x-unicode
746              
747             See B in
748             L.
749              
750             Aliases: regex-x-unicode regex-x-handles-unicode
751              
752             =head2 5.024
753              
754             =head3 unicode8.0
755              
756             L.
757              
758             Alias: unicode-8.0
759              
760             =head3 \b{lb}
761              
762             L.
763              
764             =head3 sprintf-reorder
765              
766             L.
767              
768             Aliases: printf-precision-argument-reorder sprintf-precision-argument-reorder
769              
770             =head2 5.026
771              
772             =head3 <<~
773              
774             L.
775              
776             Alias: heredoc-indent
777              
778             =head3 /xx
779              
780             L.
781              
782             Alias: regex-xx
783              
784             =head3 ^CAPTURE
785              
786             See C<@{^CAPTURE}>, C<%{^CAPTURE}>, and C<%{^CAPTURE_ALL}> in
787             L.
788              
789             Alias: capture-variable
790              
791             =head3 unicode9.0
792              
793             L.
794              
795             Alias: unicode-9.0
796              
797             =head3 unicode-scx
798              
799             See I<"Use of \p{script} uses the improved Script_Extensions property">
800             in L.
801              
802             =head3 scalar%
803              
804             See L. Specifying this
805             construct means the 5.026+ behaviour, i.e. C returns the number
806             of keys.
807              
808             Alias: scalar-hash
809              
810             =head2 5.028
811              
812             =head3 delete%
813              
814             See L.
815              
816             Alias: hash-delete-slice
817              
818             =head3 unicode10.0
819              
820             See L.
821              
822             Alias: unicode-10.0
823              
824             =head3 state@=
825              
826             See L.
827              
828             Aliases: state-array state-hash list-context-state
829              
830             =head2 5.030
831              
832             =head3 unicode12.1
833              
834             L
835              
836             Alias: unicode-12.1
837              
838             =head3 uniprop_wildcards
839              
840             L
841              
842             =head3 qr'N
843              
844             L
845              
846             Alias: named-char-in-single-quoted-regex
847              
848             =head3 turkic-casing
849              
850             See L.
851             B the actual behaviour depends on the operating system's
852             locale support. E.g. FreeBSD, DragonFly, and Solaris are known not to
853             support it.
854              
855             =head3 ^RE_COMPILE_RECURSION_LIMIT
856              
857             Not mentioned in any Delta. See L.
858              
859             Alias: re-compile-recursion-limit
860              
861             =head2 5.032
862              
863             =head3 unicode13.0
864              
865             L
866              
867             Alias: unicode-13.0
868              
869             =head3 chained-comparisons
870              
871             L
872              
873             =head3 unicode-identifier-status
874              
875             L
876              
877             Alias: unicode-identifier-type
878              
879             =head3 unicode-name-property
880              
881             L
882              
883             =head2 5.034
884              
885             =head3 {,n}
886              
887             L
888              
889             Alias: empty-left-quantifier
890              
891             =head3 0o
892              
893             L
894              
895             Alias: octal-literals
896              
897             =head3 blanks-in-curlies
898              
899             L
900              
901             =head2 5.036
902              
903             =head3 unicode14.0
904              
905             L
906              
907             =head2 5.038
908              
909             =head3 unicode15.0
910              
911             L
912              
913             =head3 ^HOOK
914              
915             L
916              
917             Alias: keyword-hook
918              
919             =head3 signature-default-operator
920              
921             L
922              
923             =head3 INCDIR
924              
925             L
926              
927             =head3 *{}
928              
929             L
930              
931             Alias: optimistic-eval
932              
933             =head3 REG_INF_I32_MAX
934              
935             L
936              
937             =head3 ^LAST_SUCCESSFUL_PATTERN
938              
939             L
940              
941             =for completeness
942             =head2 old
943              
944             =head2 Removed Constructs
945              
946             Only constructs not mentioned above are listed here, i.e. constructs
947             that were introduced before 5.008001.
948              
949             =head3 ??
950              
951             Removed in 5.022. See L
952             explicit operator has been removed>.
953              
954             =head3 no-sigil
955              
956             Removed in 5.022, not documented. Before that, if the first argument
957             to C, C, C, C, C, C,
958             C, and C was a global variable, it was possible to omit
959             its sigil, e.g.
960              
961             push arr, 12; # same as push @arr, 12
962              
963             =head3 for-qw
964              
965             Removed in 5.018. See L.
966              
967             =head3 @_=split
968              
969             Removed in 5.012, but documented in 5.014. See L.
970              
971             Alias: split-populates-@_
972              
973             =head2 Accepted Features
974              
975             Some features have been accepted in Perl (C and
976             C in 5.024, C in 5.026). In the spirit of
977             Syntax::Construct, you should still declare them, even if their usage
978             has no effect in newer Perl versions to provide meaningful error
979             messages to users of older versions.
980              
981             =head1 AUTHOR
982              
983             E. Choroba, C<< >>
984              
985             =head2 Contributors
986              
987             Gabor Szabo, JJ Merelo, tynovsky, Chris White, Mohammad S Anwar,
988             Branislav Zahradnik
989              
990             =head1 BUGS
991              
992             Please report any bugs or feature requests to the GitHub repository,
993             see below.
994              
995             =head2 Unstable Perl Versions
996              
997             In development versions of Perl, the removal of constructs is tested
998             against the coming stable version -- e.g., 5.023 forbids all the
999             removed constructs of 5.024. The behaviour of the module in such
1000             circumstances might still be, um, unstable.
1001              
1002             =head1 SUPPORT
1003              
1004             You can find documentation for this module with the perldoc command.
1005              
1006             perldoc Syntax::Construct
1007              
1008             You can also look for information at:
1009              
1010             =over 4
1011              
1012             =item * GitHub Repository
1013              
1014             L
1015              
1016             Feel free to report issues and submit pull requests.
1017              
1018             =item * MetaCPAN, Open Source Search Engine for CPAN
1019              
1020             L
1021              
1022             =item * Search CPAN
1023              
1024             L
1025              
1026             =back
1027              
1028             =head1 SEE ALSO
1029              
1030             L, L
1031              
1032             =head1 LICENSE AND COPYRIGHT
1033              
1034             Copyright 2013 - 2023 E. Choroba.
1035              
1036             This program is free software; you can redistribute it and/or modify it
1037             under the terms of the the Artistic License (2.0). You may obtain a
1038             copy of the full license at:
1039              
1040             L
1041              
1042             Any use, modification, and distribution of the Standard or Modified
1043             Versions is governed by this Artistic License. By using, modifying or
1044             distributing the Package, you accept this license. Do not use, modify,
1045             or distribute the Package, if you do not accept this license.
1046              
1047             If your Modified Version has been derived from a Modified Version made
1048             by someone other than you, you are nevertheless required to ensure that
1049             your Modified Version complies with the requirements of this license.
1050              
1051             This license does not grant you the right to use any trademark, service
1052             mark, tradename, or logo of the Copyright Holder.
1053              
1054             This license includes the non-exclusive, worldwide, free-of-charge
1055             patent license to make, have made, use, offer to sell, sell, import and
1056             otherwise transfer the Package with respect to any patent claims
1057             licensable by the Copyright Holder that are necessarily infringed by the
1058             Package. If you institute patent litigation (including a cross-claim or
1059             counterclaim) against any party alleging that the Package constitutes
1060             direct or contributory patent infringement, then this Artistic License
1061             to you shall terminate on the date that such litigation is filed.
1062              
1063             Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER
1064             AND CONTRIBUTORS "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
1065             THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
1066             PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY
1067             YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR
1068             CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR
1069             CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE,
1070             EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1071              
1072              
1073             =cut
1074              
1075             __PACKAGE__