This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
tweak for change#6127
[perl5.git] / pod / perltrap.pod
1 =head1 NAME
2
3 perltrap - Perl traps for the unwary
4
5 =head1 DESCRIPTION
6
7 The biggest trap of all is forgetting to use the B<-w> switch; see
8 L<perlrun>.  The second biggest trap is not making your entire program
9 runnable under C<use strict>.  The third biggest trap is not reading
10 the list of changes in this version of Perl; see L<perldelta>.
11
12 =head2 Awk Traps
13
14 Accustomed B<awk> users should take special note of the following:
15
16 =over 4
17
18 =item *
19
20 The English module, loaded via
21
22     use English;
23
24 allows you to refer to special variables (like C<$/>) with names (like
25 $RS), as though they were in B<awk>; see L<perlvar> for details.
26
27 =item *
28
29 Semicolons are required after all simple statements in Perl (except
30 at the end of a block).  Newline is not a statement delimiter.
31
32 =item *
33
34 Curly brackets are required on C<if>s and C<while>s.
35
36 =item *
37
38 Variables begin with "$", "@" or "%" in Perl.
39
40 =item *
41
42 Arrays index from 0.  Likewise string positions in substr() and
43 index().
44
45 =item *
46
47 You have to decide whether your array has numeric or string indices.
48
49 =item *
50
51 Hash values do not spring into existence upon mere reference.
52
53 =item *
54
55 You have to decide whether you want to use string or numeric
56 comparisons.
57
58 =item *
59
60 Reading an input line does not split it for you.  You get to split it
61 to an array yourself.  And the split() operator has different
62 arguments than B<awk>'s.
63
64 =item *
65
66 The current input line is normally in $_, not $0.  It generally does
67 not have the newline stripped.  ($0 is the name of the program
68 executed.)  See L<perlvar>.
69
70 =item *
71
72 $<I<digit>> does not refer to fields--it refers to substrings matched
73 by the last match pattern.
74
75 =item *
76
77 The print() statement does not add field and record separators unless
78 you set C<$,> and C<$\>.  You can set $OFS and $ORS if you're using
79 the English module.
80
81 =item *
82
83 You must open your files before you print to them.
84
85 =item *
86
87 The range operator is "..", not comma.  The comma operator works as in
88 C.
89
90 =item *
91
92 The match operator is "=~", not "~".  ("~" is the one's complement
93 operator, as in C.)
94
95 =item *
96
97 The exponentiation operator is "**", not "^".  "^" is the XOR
98 operator, as in C.  (You know, one could get the feeling that B<awk> is
99 basically incompatible with C.)
100
101 =item *
102
103 The concatenation operator is ".", not the null string.  (Using the
104 null string would render C</pat/ /pat/> unparsable, because the third slash
105 would be interpreted as a division operator--the tokenizer is in fact
106 slightly context sensitive for operators like "/", "?", and ">".
107 And in fact, "." itself can be the beginning of a number.)
108
109 =item *
110
111 The C<next>, C<exit>, and C<continue> keywords work differently.
112
113 =item *
114
115
116 The following variables work differently:
117
118       Awk       Perl
119       ARGC      $#ARGV or scalar @ARGV
120       ARGV[0]   $0
121       FILENAME  $ARGV
122       FNR       $. - something
123       FS        (whatever you like)
124       NF        $#Fld, or some such
125       NR        $.
126       OFMT      $#
127       OFS       $,
128       ORS       $\
129       RLENGTH   length($&)
130       RS        $/
131       RSTART    length($`)
132       SUBSEP    $;
133
134 =item *
135
136 You cannot set $RS to a pattern, only a string.
137
138 =item *
139
140 When in doubt, run the B<awk> construct through B<a2p> and see what it
141 gives you.
142
143 =back
144
145 =head2 C Traps
146
147 Cerebral C programmers should take note of the following:
148
149 =over 4
150
151 =item *
152
153 Curly brackets are required on C<if>'s and C<while>'s.
154
155 =item *
156
157 You must use C<elsif> rather than C<else if>.
158
159 =item *
160
161 The C<break> and C<continue> keywords from C become in
162 Perl C<last> and C<next>, respectively.
163 Unlike in C, these do I<not> work within a C<do { } while> construct.
164
165 =item *
166
167 There's no switch statement.  (But it's easy to build one on the fly.)
168
169 =item *
170
171 Variables begin with "$", "@" or "%" in Perl.
172
173 =item *
174
175 Comments begin with "#", not "/*".
176
177 =item *
178
179 You can't take the address of anything, although a similar operator
180 in Perl is the backslash, which creates a reference.
181
182 =item *
183
184 C<ARGV> must be capitalized.  C<$ARGV[0]> is C's C<argv[1]>, and C<argv[0]>
185 ends up in C<$0>.
186
187 =item *
188
189 System calls such as link(), unlink(), rename(), etc. return nonzero for
190 success, not 0.
191
192 =item *
193
194 Signal handlers deal with signal names, not numbers.  Use C<kill -l>
195 to find their names on your system.
196
197 =back
198
199 =head2 Sed Traps
200
201 Seasoned B<sed> programmers should take note of the following:
202
203 =over 4
204
205 =item *
206
207 Backreferences in substitutions use "$" rather than "\".
208
209 =item *
210
211 The pattern matching metacharacters "(", ")", and "|" do not have backslashes
212 in front.
213
214 =item *
215
216 The range operator is C<...>, rather than comma.
217
218 =back
219
220 =head2 Shell Traps
221
222 Sharp shell programmers should take note of the following:
223
224 =over 4
225
226 =item *
227
228 The backtick operator does variable interpolation without regard to
229 the presence of single quotes in the command.
230
231 =item *
232
233 The backtick operator does no translation of the return value, unlike B<csh>.
234
235 =item *
236
237 Shells (especially B<csh>) do several levels of substitution on each
238 command line.  Perl does substitution in only certain constructs
239 such as double quotes, backticks, angle brackets, and search patterns.
240
241 =item *
242
243 Shells interpret scripts a little bit at a time.  Perl compiles the
244 entire program before executing it (except for C<BEGIN> blocks, which
245 execute at compile time).
246
247 =item *
248
249 The arguments are available via @ARGV, not $1, $2, etc.
250
251 =item *
252
253 The environment is not automatically made available as separate scalar
254 variables.
255
256 =back
257
258 =head2 Perl Traps
259
260 Practicing Perl Programmers should take note of the following:
261
262 =over 4
263
264 =item *
265
266 Remember that many operations behave differently in a list
267 context than they do in a scalar one.  See L<perldata> for details.
268
269 =item *
270
271 Avoid barewords if you can, especially all lowercase ones.
272 You can't tell by just looking at it whether a bareword is
273 a function or a string.  By using quotes on strings and
274 parentheses on function calls, you won't ever get them confused.
275
276 =item *
277
278 You cannot discern from mere inspection which builtins
279 are unary operators (like chop() and chdir())
280 and which are list operators (like print() and unlink()).
281 (User-defined subroutines can be B<only> list operators, never
282 unary ones.)  See L<perlop>.
283
284 =item *
285
286 People have a hard time remembering that some functions
287 default to $_, or @ARGV, or whatever, but that others which
288 you might expect to do not.
289
290 =item *
291
292 The <FH> construct is not the name of the filehandle, it is a readline
293 operation on that handle.  The data read is assigned to $_ only if the
294 file read is the sole condition in a while loop:
295
296     while (<FH>)      { }
297     while (defined($_ = <FH>)) { }..
298     <FH>;  # data discarded!
299
300 =item *
301
302 Remember not to use C<=> when you need C<=~>;
303 these two constructs are quite different:
304
305     $x =  /foo/;
306     $x =~ /foo/;
307
308 =item *
309
310 The C<do {}> construct isn't a real loop that you can use
311 loop control on.
312
313 =item *
314
315 Use C<my()> for local variables whenever you can get away with
316 it (but see L<perlform> for where you can't).
317 Using C<local()> actually gives a local value to a global
318 variable, which leaves you open to unforeseen side-effects
319 of dynamic scoping.
320
321 =item *
322
323 If you localize an exported variable in a module, its exported value will
324 not change.  The local name becomes an alias to a new value but the
325 external name is still an alias for the original.
326
327 =back
328
329 =head2 Perl4 to Perl5 Traps
330
331 Practicing Perl4 Programmers should take note of the following
332 Perl4-to-Perl5 specific traps.
333
334 They're crudely ordered according to the following list:
335
336 =over 4
337
338 =item Discontinuance, Deprecation, and BugFix traps
339
340 Anything that's been fixed as a perl4 bug, removed as a perl4 feature
341 or deprecated as a perl4 feature with the intent to encourage usage of
342 some other perl5 feature.
343
344 =item Parsing Traps
345
346 Traps that appear to stem from the new parser.
347
348 =item Numerical Traps
349
350 Traps having to do with numerical or mathematical operators.
351
352 =item General data type traps
353
354 Traps involving perl standard data types.
355
356 =item Context Traps - scalar, list contexts
357
358 Traps related to context within lists, scalar statements/declarations.
359
360 =item Precedence Traps
361
362 Traps related to the precedence of parsing, evaluation, and execution of
363 code.
364
365 =item General Regular Expression Traps using s///, etc.
366
367 Traps related to the use of pattern matching.
368
369 =item Subroutine, Signal, Sorting Traps
370
371 Traps related to the use of signals and signal handlers, general subroutines,
372 and sorting, along with sorting subroutines.
373
374 =item OS Traps
375
376 OS-specific traps.
377
378 =item DBM Traps
379
380 Traps specific to the use of C<dbmopen()>, and specific dbm implementations.
381
382 =item Unclassified Traps
383
384 Everything else.
385
386 =back
387
388 If you find an example of a conversion trap that is not listed here,
389 please submit it to <F<perlbug@perl.org>> for inclusion.
390 Also note that at least some of these can be caught with the
391 C<use warnings> pragma or the B<-w> switch.
392
393 =head2 Discontinuance, Deprecation, and BugFix traps
394
395 Anything that has been discontinued, deprecated, or fixed as
396 a bug from perl4.
397
398 =over 4
399
400 =item * Discontinuance
401
402 Symbols starting with "_" are no longer forced into package main, except
403 for C<$_> itself (and C<@_>, etc.).
404
405     package test;
406     $_legacy = 1;
407
408     package main;
409     print "\$_legacy is ",$_legacy,"\n";
410
411     # perl4 prints: $_legacy is 1
412     # perl5 prints: $_legacy is
413
414 =item * Deprecation
415
416 Double-colon is now a valid package separator in a variable name.  Thus these
417 behave differently in perl4 vs. perl5, because the packages don't exist.
418
419     $a=1;$b=2;$c=3;$var=4;
420     print "$a::$b::$c ";
421     print "$var::abc::xyz\n";
422
423     # perl4 prints: 1::2::3 4::abc::xyz
424     # perl5 prints: 3
425
426 Given that C<::> is now the preferred package delimiter, it is debatable
427 whether this should be classed as a bug or not.
428 (The older package delimiter, ' ,is used here)
429
430     $x = 10 ;
431     print "x=${'x}\n" ;
432
433     # perl4 prints: x=10
434     # perl5 prints: Can't find string terminator "'" anywhere before EOF
435
436 You can avoid this problem, and remain compatible with perl4, if you
437 always explicitly include the package name:
438
439     $x = 10 ;
440     print "x=${main'x}\n" ;
441
442 Also see precedence traps, for parsing C<$:>.
443
444 =item * BugFix
445
446 The second and third arguments of C<splice()> are now evaluated in scalar
447 context (as the Camel says) rather than list context.
448
449     sub sub1{return(0,2) }          # return a 2-element list
450     sub sub2{ return(1,2,3)}        # return a 3-element list
451     @a1 = ("a","b","c","d","e");
452     @a2 = splice(@a1,&sub1,&sub2);
453     print join(' ',@a2),"\n";
454
455     # perl4 prints: a b
456     # perl5 prints: c d e
457
458 =item * Discontinuance
459
460 You can't do a C<goto> into a block that is optimized away.  Darn.
461
462     goto marker1;
463
464     for(1){
465     marker1:
466         print "Here I is!\n";
467     }
468
469     # perl4 prints: Here I is!
470     # perl5 dumps core (SEGV)
471
472 =item * Discontinuance
473
474 It is no longer syntactically legal to use whitespace as the name
475 of a variable, or as a delimiter for any kind of quote construct.
476 Double darn.
477
478     $a = ("foo bar");
479     $b = q baz ;
480     print "a is $a, b is $b\n";
481
482     # perl4 prints: a is foo bar, b is baz
483     # perl5 errors: Bareword found where operator expected
484
485 =item * Discontinuance
486
487 The archaic while/if BLOCK BLOCK syntax is no longer supported.
488
489     if { 1 } {
490         print "True!";
491     }
492     else {
493         print "False!";
494     }
495
496     # perl4 prints: True!
497     # perl5 errors: syntax error at test.pl line 1, near "if {"
498
499 =item * BugFix
500
501 The C<**> operator now binds more tightly than unary minus.
502 It was documented to work this way before, but didn't.
503
504     print -4**2,"\n";
505
506     # perl4 prints: 16
507     # perl5 prints: -16
508
509 =item * Discontinuance
510
511 The meaning of C<foreach{}> has changed slightly when it is iterating over a
512 list which is not an array.  This used to assign the list to a
513 temporary array, but no longer does so (for efficiency).  This means
514 that you'll now be iterating over the actual values, not over copies of
515 the values.  Modifications to the loop variable can change the original
516 values.
517
518     @list = ('ab','abc','bcd','def');
519     foreach $var (grep(/ab/,@list)){
520         $var = 1;
521     }
522     print (join(':',@list));
523
524     # perl4 prints: ab:abc:bcd:def
525     # perl5 prints: 1:1:bcd:def
526
527 To retain Perl4 semantics you need to assign your list
528 explicitly to a temporary array and then iterate over that.  For
529 example, you might need to change
530
531     foreach $var (grep(/ab/,@list)){
532
533 to
534
535     foreach $var (@tmp = grep(/ab/,@list)){
536
537 Otherwise changing $var will clobber the values of @list.  (This most often
538 happens when you use C<$_> for the loop variable, and call subroutines in
539 the loop that don't properly localize C<$_>.)
540
541 =item * Discontinuance
542
543 C<split> with no arguments now behaves like C<split ' '> (which doesn't
544 return an initial null field if $_ starts with whitespace), it used to
545 behave like C<split /\s+/> (which does).
546
547     $_ = ' hi mom';
548     print join(':', split);
549
550     # perl4 prints: :hi:mom
551     # perl5 prints: hi:mom
552
553 =item * BugFix
554
555 Perl 4 would ignore any text which was attached to an B<-e> switch,
556 always taking the code snippet from the following arg.  Additionally, it
557 would silently accept an B<-e> switch without a following arg.  Both of
558 these behaviors have been fixed.
559
560     perl -e'print "attached to -e"' 'print "separate arg"'
561
562     # perl4 prints: separate arg
563     # perl5 prints: attached to -e
564
565     perl -e
566
567     # perl4 prints:
568     # perl5 dies: No code specified for -e.
569
570 =item * Discontinuance
571
572 In Perl 4 the return value of C<push> was undocumented, but it was
573 actually the last value being pushed onto the target list.  In Perl 5
574 the return value of C<push> is documented, but has changed, it is the
575 number of elements in the resulting list.
576
577     @x = ('existing');
578     print push(@x, 'first new', 'second new');
579
580     # perl4 prints: second new
581     # perl5 prints: 3
582
583 =item * Deprecation
584
585 Some error messages will be different.
586
587 =item * Discontinuance
588
589 Some bugs may have been inadvertently removed.  :-)
590
591 =back
592
593 =head2 Parsing Traps
594
595 Perl4-to-Perl5 traps from having to do with parsing.
596
597 =over 4
598
599 =item * Parsing
600
601 Note the space between . and =
602
603     $string . = "more string";
604     print $string;
605
606     # perl4 prints: more string
607     # perl5 prints: syntax error at - line 1, near ". ="
608
609 =item * Parsing
610
611 Better parsing in perl 5
612
613     sub foo {}
614     &foo
615     print("hello, world\n");
616
617     # perl4 prints: hello, world
618     # perl5 prints: syntax error
619
620 =item * Parsing
621
622 "if it looks like a function, it is a function" rule.
623
624   print
625     ($foo == 1) ? "is one\n" : "is zero\n";
626
627     # perl4 prints: is zero
628     # perl5 warns: "Useless use of a constant in void context" if using -w
629
630 =item * Parsing
631
632 String interpolation of the C<$#array> construct differs when braces
633 are to used around the name.
634
635     @ = (1..3);
636     print "${#a}";
637
638     # perl4 prints: 2
639     # perl5 fails with syntax error
640
641     @ = (1..3);
642     print "$#{a}";
643
644     # perl4 prints: {a}
645     # perl5 prints: 2
646
647 =back
648
649 =head2 Numerical Traps
650
651 Perl4-to-Perl5 traps having to do with numerical operators,
652 operands, or output from same.
653
654 =over 5
655
656 =item * Numerical
657
658 Formatted output and significant digits
659
660     print 7.373504 - 0, "\n";
661     printf "%20.18f\n", 7.373504 - 0;
662
663     # Perl4 prints:
664     7.375039999999996141
665     7.37503999999999614
666
667     # Perl5 prints:
668     7.373504
669     7.37503999999999614
670
671 =item * Numerical
672
673 This specific item has been deleted.  It demonstrated how the auto-increment
674 operator would not catch when a number went over the signed int limit.  Fixed
675 in version 5.003_04.  But always be wary when using large integers.
676 If in doubt:
677
678    use Math::BigInt;
679
680 =item * Numerical
681
682 Assignment of return values from numeric equality tests
683 does not work in perl5 when the test evaluates to false (0).
684 Logical tests now return an null, instead of 0
685
686     $p = ($test == 1);
687     print $p,"\n";
688
689     # perl4 prints: 0
690     # perl5 prints:
691
692 Also see L<"General Regular Expression Traps using s///, etc.">
693 for another example of this new feature...
694
695 =item * Bitwise string ops
696
697 When bitwise operators which can operate upon either numbers or
698 strings (C<& | ^ ~>) are given only strings as arguments, perl4 would
699 treat the operands as bitstrings so long as the program contained a call
700 to the C<vec()> function. perl5 treats the string operands as bitstrings.
701 (See L<perlop/Bitwise String Operators> for more details.)
702
703     $fred = "10";
704     $barney = "12";
705     $betty = $fred & $barney;
706     print "$betty\n";
707     # Uncomment the next line to change perl4's behavior
708     # ($dummy) = vec("dummy", 0, 0);
709
710     # Perl4 prints:
711     8
712
713     # Perl5 prints:
714     10
715
716     # If vec() is used anywhere in the program, both print:
717     10
718
719 =back
720
721 =head2 General data type traps
722
723 Perl4-to-Perl5 traps involving most data-types, and their usage
724 within certain expressions and/or context.
725
726 =over 5
727
728 =item * (Arrays)
729
730 Negative array subscripts now count from the end of the array.
731
732     @a = (1, 2, 3, 4, 5);
733     print "The third element of the array is $a[3] also expressed as $a[-2] \n";
734
735     # perl4 prints: The third element of the array is 4 also expressed as
736     # perl5 prints: The third element of the array is 4 also expressed as 4
737
738 =item * (Arrays)
739
740 Setting C<$#array> lower now discards array elements, and makes them
741 impossible to recover.
742
743     @a = (a,b,c,d,e);
744     print "Before: ",join('',@a);
745     $#a =1;
746     print ", After: ",join('',@a);
747     $#a =3;
748     print ", Recovered: ",join('',@a),"\n";
749
750     # perl4 prints: Before: abcde, After: ab, Recovered: abcd
751     # perl5 prints: Before: abcde, After: ab, Recovered: ab
752
753 =item * (Hashes)
754
755 Hashes get defined before use
756
757     local($s,@a,%h);
758     die "scalar \$s defined" if defined($s);
759     die "array \@a defined" if defined(@a);
760     die "hash \%h defined" if defined(%h);
761
762     # perl4 prints:
763     # perl5 dies: hash %h defined
764
765 Perl will now generate a warning when it sees defined(@a) and
766 defined(%h).
767
768 =item * (Globs)
769
770 glob assignment from variable to variable will fail if the assigned
771 variable is localized subsequent to the assignment
772
773     @a = ("This is Perl 4");
774     *b = *a;
775     local(@a);
776     print @b,"\n";
777
778     # perl4 prints: This is Perl 4
779     # perl5 prints:
780
781 =item * (Globs)
782
783 Assigning C<undef> to a glob has no effect in Perl 5.   In Perl 4
784 it undefines the associated scalar (but may have other side effects
785 including SEGVs).
786
787 =item * (Scalar String)
788
789 Changes in unary negation (of strings)
790 This change effects both the return value and what it
791 does to auto(magic)increment.
792
793     $x = "aaa";
794     print ++$x," : ";
795     print -$x," : ";
796     print ++$x,"\n";
797
798     # perl4 prints: aab : -0 : 1
799     # perl5 prints: aab : -aab : aac
800
801 =item * (Constants)
802
803 perl 4 lets you modify constants:
804
805     $foo = "x";
806     &mod($foo);
807     for ($x = 0; $x < 3; $x++) {
808         &mod("a");
809     }
810     sub mod {
811         print "before: $_[0]";
812         $_[0] = "m";
813         print "  after: $_[0]\n";
814     }
815
816     # perl4:
817     # before: x  after: m
818     # before: a  after: m
819     # before: m  after: m
820     # before: m  after: m
821
822     # Perl5:
823     # before: x  after: m
824     # Modification of a read-only value attempted at foo.pl line 12.
825     # before: a
826
827 =item * (Scalars)
828
829 The behavior is slightly different for:
830
831     print "$x", defined $x
832
833     # perl 4: 1
834     # perl 5: <no output, $x is not called into existence>
835
836 =item * (Variable Suicide)
837
838 Variable suicide behavior is more consistent under Perl 5.
839 Perl5 exhibits the same behavior for hashes and scalars,
840 that perl4 exhibits for only scalars.
841
842     $aGlobal{ "aKey" } = "global value";
843     print "MAIN:", $aGlobal{"aKey"}, "\n";
844     $GlobalLevel = 0;
845     &test( *aGlobal );
846
847     sub test {
848         local( *theArgument ) = @_;
849         local( %aNewLocal ); # perl 4 != 5.001l,m
850         $aNewLocal{"aKey"} = "this should never appear";
851         print "SUB: ", $theArgument{"aKey"}, "\n";
852         $aNewLocal{"aKey"} = "level $GlobalLevel";   # what should print
853         $GlobalLevel++;
854         if( $GlobalLevel<4 ) {
855             &test( *aNewLocal );
856         }
857     }
858
859     # Perl4:
860     # MAIN:global value
861     # SUB: global value
862     # SUB: level 0
863     # SUB: level 1
864     # SUB: level 2
865
866     # Perl5:
867     # MAIN:global value
868     # SUB: global value
869     # SUB: this should never appear
870     # SUB: this should never appear
871     # SUB: this should never appear
872
873 =back
874
875 =head2 Context Traps - scalar, list contexts
876
877 =over 5
878
879 =item * (list context)
880
881 The elements of argument lists for formats are now evaluated in list
882 context.  This means you can interpolate list values now.
883
884     @fmt = ("foo","bar","baz");
885     format STDOUT=
886     @<<<<< @||||| @>>>>>
887     @fmt;
888     .
889     write;
890
891     # perl4 errors:  Please use commas to separate fields in file
892     # perl5 prints: foo     bar      baz
893
894 =item * (scalar context)
895
896 The C<caller()> function now returns a false value in a scalar context
897 if there is no caller.  This lets library files determine if they're
898 being required.
899
900     caller() ? (print "You rang?\n") : (print "Got a 0\n");
901
902     # perl4 errors: There is no caller
903     # perl5 prints: Got a 0
904
905 =item * (scalar context)
906
907 The comma operator in a scalar context is now guaranteed to give a
908 scalar context to its arguments.
909
910     @y= ('a','b','c');
911     $x = (1, 2, @y);
912     print "x = $x\n";
913
914     # Perl4 prints:  x = c   # Thinks list context interpolates list
915     # Perl5 prints:  x = 3   # Knows scalar uses length of list
916
917 =item * (list, builtin)
918
919 C<sprintf()> funkiness (array argument converted to scalar array count)
920 This test could be added to t/op/sprintf.t
921
922     @z = ('%s%s', 'foo', 'bar');
923     $x = sprintf(@z);
924     if ($x eq 'foobar') {print "ok 2\n";} else {print "not ok 2 '$x'\n";}
925
926     # perl4 prints: ok 2
927     # perl5 prints: not ok 2
928
929 C<printf()> works fine, though:
930
931     printf STDOUT (@z);
932     print "\n";
933
934     # perl4 prints: foobar
935     # perl5 prints: foobar
936
937 Probably a bug.
938
939 =back
940
941 =head2 Precedence Traps
942
943 Perl4-to-Perl5 traps involving precedence order.
944
945 Perl 4 has almost the same precedence rules as Perl 5 for the operators
946 that they both have.  Perl 4 however, seems to have had some
947 inconsistencies that made the behavior differ from what was documented.
948
949 =over 5
950
951 =item * Precedence
952
953 LHS vs. RHS of any assignment operator.  LHS is evaluated first
954 in perl4, second in perl5; this can affect the relationship
955 between side-effects in sub-expressions.
956
957     @arr = ( 'left', 'right' );
958     $a{shift @arr} = shift @arr;
959     print join( ' ', keys %a );
960
961     # perl4 prints: left
962     # perl5 prints: right
963
964 =item * Precedence
965
966 These are now semantic errors because of precedence:
967
968     @list = (1,2,3,4,5);
969     %map = ("a",1,"b",2,"c",3,"d",4);
970     $n = shift @list + 2;   # first item in list plus 2
971     print "n is $n, ";
972     $m = keys %map + 2;     # number of items in hash plus 2
973     print "m is $m\n";
974
975     # perl4 prints: n is 3, m is 6
976     # perl5 errors and fails to compile
977
978 =item * Precedence
979
980 The precedence of assignment operators is now the same as the precedence
981 of assignment.  Perl 4 mistakenly gave them the precedence of the associated
982 operator.  So you now must parenthesize them in expressions like
983
984     /foo/ ? ($a += 2) : ($a -= 2);
985
986 Otherwise
987
988     /foo/ ? $a += 2 : $a -= 2
989
990 would be erroneously parsed as
991
992     (/foo/ ? $a += 2 : $a) -= 2;
993
994 On the other hand,
995
996     $a += /foo/ ? 1 : 2;
997
998 now works as a C programmer would expect.
999
1000 =item * Precedence
1001
1002     open FOO || die;
1003
1004 is now incorrect.  You need parentheses around the filehandle.
1005 Otherwise, perl5 leaves the statement as its default precedence:
1006
1007     open(FOO || die);
1008
1009     # perl4 opens or dies
1010     # perl5 errors: Precedence problem: open FOO should be open(FOO)
1011
1012 =item * Precedence
1013
1014 perl4 gives the special variable, C<$:> precedence, where perl5
1015 treats C<$::> as main C<package>
1016
1017     $a = "x"; print "$::a";
1018
1019     # perl 4 prints: -:a
1020     # perl 5 prints: x
1021
1022 =item * Precedence
1023
1024 perl4 had buggy precedence for the file test operators vis-a-vis
1025 the assignment operators.  Thus, although the precedence table
1026 for perl4 leads one to believe C<-e $foo .= "q"> should parse as
1027 C<((-e $foo) .= "q")>, it actually parses as C<(-e ($foo .= "q"))>.
1028 In perl5, the precedence is as documented.
1029
1030     -e $foo .= "q"
1031
1032     # perl4 prints: no output
1033     # perl5 prints: Can't modify -e in concatenation
1034
1035 =item * Precedence
1036
1037 In perl4, keys(), each() and values() were special high-precedence operators
1038 that operated on a single hash, but in perl5, they are regular named unary
1039 operators.  As documented, named unary operators have lower precedence
1040 than the arithmetic and concatenation operators C<+ - .>, but the perl4
1041 variants of these operators actually bind tighter than C<+ - .>.
1042 Thus, for:
1043
1044     %foo = 1..10;
1045     print keys %foo - 1
1046
1047     # perl4 prints: 4
1048     # perl5 prints: Type of arg 1 to keys must be hash (not subtraction)
1049
1050 The perl4 behavior was probably more useful, if less consistent.
1051
1052 =back
1053
1054 =head2 General Regular Expression Traps using s///, etc.
1055
1056 All types of RE traps.
1057
1058 =over 5
1059
1060 =item * Regular Expression
1061
1062 C<s'$lhs'$rhs'> now does no interpolation on either side.  It used to
1063 interpolate $lhs but not $rhs.  (And still does not match a literal
1064 '$' in string)
1065
1066     $a=1;$b=2;
1067     $string = '1 2 $a $b';
1068     $string =~ s'$a'$b';
1069     print $string,"\n";
1070
1071     # perl4 prints: $b 2 $a $b
1072     # perl5 prints: 1 2 $a $b
1073
1074 =item * Regular Expression
1075
1076 C<m//g> now attaches its state to the searched string rather than the
1077 regular expression.  (Once the scope of a block is left for the sub, the
1078 state of the searched string is lost)
1079
1080     $_ = "ababab";
1081     while(m/ab/g){
1082         &doit("blah");
1083     }
1084     sub doit{local($_) = shift; print "Got $_ "}
1085
1086     # perl4 prints: blah blah blah
1087     # perl5 prints: infinite loop blah...
1088
1089 =item * Regular Expression
1090
1091 Currently, if you use the C<m//o> qualifier on a regular expression
1092 within an anonymous sub, I<all> closures generated from that anonymous
1093 sub will use the regular expression as it was compiled when it was used
1094 the very first time in any such closure.  For instance, if you say
1095
1096     sub build_match {
1097         my($left,$right) = @_;
1098         return sub { $_[0] =~ /$left stuff $right/o; };
1099     }
1100
1101 build_match() will always return a sub which matches the contents of
1102 $left and $right as they were the I<first> time that build_match()
1103 was called, not as they are in the current call.
1104
1105 This is probably a bug, and may change in future versions of Perl.
1106
1107 =item * Regular Expression
1108
1109 If no parentheses are used in a match, Perl4 sets C<$+> to
1110 the whole match, just like C<$&>. Perl5 does not.
1111
1112     "abcdef" =~ /b.*e/;
1113     print "\$+ = $+\n";
1114
1115     # perl4 prints: bcde
1116     # perl5 prints:
1117
1118 =item * Regular Expression
1119
1120 substitution now returns the null string if it fails
1121
1122     $string = "test";
1123     $value = ($string =~ s/foo//);
1124     print $value, "\n";
1125
1126     # perl4 prints: 0
1127     # perl5 prints:
1128
1129 Also see L<Numerical Traps> for another example of this new feature.
1130
1131 =item * Regular Expression
1132
1133 C<s`lhs`rhs`> (using backticks) is now a normal substitution, with no
1134 backtick expansion
1135
1136     $string = "";
1137     $string =~ s`^`hostname`;
1138     print $string, "\n";
1139
1140     # perl4 prints: <the local hostname>
1141     # perl5 prints: hostname
1142
1143 =item * Regular Expression
1144
1145 Stricter parsing of variables used in regular expressions
1146
1147     s/^([^$grpc]*$grpc[$opt$plus$rep]?)//o;
1148
1149     # perl4: compiles w/o error
1150     # perl5: with Scalar found where operator expected ..., near "$opt$plus"
1151
1152 an added component of this example, apparently from the same script, is
1153 the actual value of the s'd string after the substitution.
1154 C<[$opt]> is a character class in perl4 and an array subscript in perl5
1155
1156     $grpc = 'a';
1157     $opt  = 'r';
1158     $_ = 'bar';
1159     s/^([^$grpc]*$grpc[$opt]?)/foo/;
1160     print ;
1161
1162     # perl4 prints: foo
1163     # perl5 prints: foobar
1164
1165 =item * Regular Expression
1166
1167 Under perl5, C<m?x?> matches only once, like C<?x?>. Under perl4, it matched
1168 repeatedly, like C</x/> or C<m!x!>.
1169
1170     $test = "once";
1171     sub match { $test =~ m?once?; }
1172     &match();
1173     if( &match() ) {
1174         # m?x? matches more then once
1175         print "perl4\n";
1176     } else {
1177         # m?x? matches only once
1178         print "perl5\n";
1179     }
1180
1181     # perl4 prints: perl4
1182     # perl5 prints: perl5
1183
1184
1185 =back
1186
1187 =head2 Subroutine, Signal, Sorting Traps
1188
1189 The general group of Perl4-to-Perl5 traps having to do with
1190 Signals, Sorting, and their related subroutines, as well as
1191 general subroutine traps.  Includes some OS-Specific traps.
1192
1193 =over 5
1194
1195 =item * (Signals)
1196
1197 Barewords that used to look like strings to Perl will now look like subroutine
1198 calls if a subroutine by that name is defined before the compiler sees them.
1199
1200     sub SeeYa { warn"Hasta la vista, baby!" }
1201     $SIG{'TERM'} = SeeYa;
1202     print "SIGTERM is now $SIG{'TERM'}\n";
1203
1204     # perl4 prints: SIGTERM is main'SeeYa
1205     # perl5 prints: SIGTERM is now main::1
1206
1207 Use B<-w> to catch this one
1208
1209 =item * (Sort Subroutine)
1210
1211 reverse is no longer allowed as the name of a sort subroutine.
1212
1213     sub reverse{ print "yup "; $a <=> $b }
1214     print sort reverse a,b,c;
1215
1216     # perl4 prints: yup yup yup yup abc
1217     # perl5 prints: abc
1218
1219 =item * warn() won't let you specify a filehandle.
1220
1221 Although it _always_ printed to STDERR, warn() would let you specify a
1222 filehandle in perl4.  With perl5 it does not.
1223
1224     warn STDERR "Foo!";
1225
1226     # perl4 prints: Foo!
1227     # perl5 prints: String found where operator expected
1228
1229 =back
1230
1231 =head2 OS Traps
1232
1233 =over 5
1234
1235 =item * (SysV)
1236
1237 Under HPUX, and some other SysV OSes, one had to reset any signal handler,
1238 within  the signal handler function, each time a signal was handled with
1239 perl4.  With perl5, the reset is now done correctly.  Any code relying
1240 on the handler _not_ being reset will have to be reworked.
1241
1242 Since version 5.002, Perl uses sigaction() under SysV.
1243
1244     sub gotit {
1245         print "Got @_... ";
1246     }
1247     $SIG{'INT'} = 'gotit';
1248
1249     $| = 1;
1250     $pid = fork;
1251     if ($pid) {
1252         kill('INT', $pid);
1253         sleep(1);
1254         kill('INT', $pid);
1255     } else {
1256         while (1) {sleep(10);}
1257     }
1258
1259     # perl4 (HPUX) prints: Got INT...
1260     # perl5 (HPUX) prints: Got INT... Got INT...
1261
1262 =item * (SysV)
1263
1264 Under SysV OSes, C<seek()> on a file opened to append C<<< >> >>> now does
1265 the right thing w.r.t. the fopen() manpage. e.g., - When a file is opened
1266 for append,  it  is  impossible to overwrite information already in
1267 the file.
1268
1269     open(TEST,">>seek.test");
1270     $start = tell TEST ;
1271     foreach(1 .. 9){
1272         print TEST "$_ ";
1273     }
1274     $end = tell TEST ;
1275     seek(TEST,$start,0);
1276     print TEST "18 characters here";
1277
1278     # perl4 (solaris) seek.test has: 18 characters here
1279     # perl5 (solaris) seek.test has: 1 2 3 4 5 6 7 8 9 18 characters here
1280
1281
1282
1283 =back
1284
1285 =head2 Interpolation Traps
1286
1287 Perl4-to-Perl5 traps having to do with how things get interpolated
1288 within certain expressions, statements, contexts, or whatever.
1289
1290 =over 5
1291
1292 =item * Interpolation
1293
1294 @ now always interpolates an array in double-quotish strings.
1295
1296     print "To: someone@somewhere.com\n";
1297
1298     # perl4 prints: To:someone@somewhere.com
1299     # perl < 5.6.1, error : In string, @somewhere now must be written as \@somewhere
1300     # perl >= 5.6.1, warning : Possible unintended interpolation of @somewhere in string
1301
1302 =item * Interpolation
1303
1304 Double-quoted strings may no longer end with an unescaped $ or @.
1305
1306     $foo = "foo$";
1307     $bar = "bar@";
1308     print "foo is $foo, bar is $bar\n";
1309
1310     # perl4 prints: foo is foo$, bar is bar@
1311     # perl5 errors: Final $ should be \$ or $name
1312
1313 Note: perl5 DOES NOT error on the terminating @ in $bar
1314
1315 =item * Interpolation
1316
1317 Perl now sometimes evaluates arbitrary expressions inside braces that occur
1318 within double quotes (usually when the opening brace is preceded by C<$>
1319 or C<@>).
1320
1321     @www = "buz";
1322     $foo = "foo";
1323     $bar = "bar";
1324     sub foo { return "bar" };
1325     print "|@{w.w.w}|${main'foo}|";
1326
1327     # perl4 prints: |@{w.w.w}|foo|
1328     # perl5 prints: |buz|bar|
1329
1330 Note that you can C<use strict;> to ward off such trappiness under perl5.
1331
1332 =item * Interpolation
1333
1334 The construct "this is $$x" used to interpolate the pid at that
1335 point, but now apparently tries to dereference $x.  C<$$> by itself still
1336 works fine, however.
1337
1338     print "this is $$x\n";
1339
1340     # perl4 prints: this is XXXx   (XXX is the current pid)
1341     # perl5 prints: this is
1342
1343 =item * Interpolation
1344
1345 Creation of hashes on the fly with C<eval "EXPR"> now requires either both
1346 C<$>'s to be protected in the specification of the hash name, or both curlies
1347 to be protected.  If both curlies are protected, the result will be compatible
1348 with perl4 and perl5.  This is a very common practice, and should be changed
1349 to use the block form of C<eval{}>  if possible.
1350
1351     $hashname = "foobar";
1352     $key = "baz";
1353     $value = 1234;
1354     eval "\$$hashname{'$key'} = q|$value|";
1355     (defined($foobar{'baz'})) ?  (print "Yup") : (print "Nope");
1356
1357     # perl4 prints: Yup
1358     # perl5 prints: Nope
1359
1360 Changing
1361
1362     eval "\$$hashname{'$key'} = q|$value|";
1363
1364 to
1365
1366     eval "\$\$hashname{'$key'} = q|$value|";
1367
1368 causes the following result:
1369
1370     # perl4 prints: Nope
1371     # perl5 prints: Yup
1372
1373 or, changing to
1374
1375     eval "\$$hashname\{'$key'\} = q|$value|";
1376
1377 causes the following result:
1378
1379     # perl4 prints: Yup
1380     # perl5 prints: Yup
1381     # and is compatible for both versions
1382
1383
1384 =item * Interpolation
1385
1386 perl4 programs which unconsciously rely on the bugs in earlier perl versions.
1387
1388     perl -e '$bar=q/not/; print "This is $foo{$bar} perl5"'
1389
1390     # perl4 prints: This is not perl5
1391     # perl5 prints: This is perl5
1392
1393 =item * Interpolation
1394
1395 You also have to be careful about array references.
1396
1397     print "$foo{"
1398
1399     perl 4 prints: {
1400     perl 5 prints: syntax error
1401
1402 =item * Interpolation
1403
1404 Similarly, watch out for:
1405
1406     $foo = "array";
1407     print "\$$foo{bar}\n";
1408
1409     # perl4 prints: $array{bar}
1410     # perl5 prints: $
1411
1412 Perl 5 is looking for C<$array{bar}> which doesn't exist, but perl 4 is
1413 happy just to expand $foo to "array" by itself.  Watch out for this
1414 especially in C<eval>'s.
1415
1416 =item * Interpolation
1417
1418 C<qq()> string passed to C<eval>
1419
1420     eval qq(
1421         foreach \$y (keys %\$x\) {
1422             \$count++;
1423         }
1424     );
1425
1426     # perl4 runs this ok
1427     # perl5 prints: Can't find string terminator ")"
1428
1429 =back
1430
1431 =head2 DBM Traps
1432
1433 General DBM traps.
1434
1435 =over 5
1436
1437 =item * DBM
1438
1439 Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
1440 may cause the same script, run under perl5, to fail.  The build of perl5
1441 must have been linked with the same dbm/ndbm as the default for C<dbmopen()>
1442 to function properly without C<tie>'ing to an extension dbm implementation.
1443
1444     dbmopen (%dbm, "file", undef);
1445     print "ok\n";
1446
1447     # perl4 prints: ok
1448     # perl5 prints: ok (IFF linked with -ldbm or -lndbm)
1449
1450
1451 =item * DBM
1452
1453 Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
1454 may cause the same script, run under perl5, to fail.  The error generated
1455 when exceeding the limit on the key/value size will cause perl5 to exit
1456 immediately.
1457
1458     dbmopen(DB, "testdb",0600) || die "couldn't open db! $!";
1459     $DB{'trap'} = "x" x 1024;  # value too large for most dbm/ndbm
1460     print "YUP\n";
1461
1462     # perl4 prints:
1463     dbm store returned -1, errno 28, key "trap" at - line 3.
1464     YUP
1465
1466     # perl5 prints:
1467     dbm store returned -1, errno 28, key "trap" at - line 3.
1468
1469 =back
1470
1471 =head2 Unclassified Traps
1472
1473 Everything else.
1474
1475 =over 5
1476
1477 =item * C<require>/C<do> trap using returned value
1478
1479 If the file doit.pl has:
1480
1481     sub foo {
1482         $rc = do "./do.pl";
1483         return 8;
1484     }
1485     print &foo, "\n";
1486
1487 And the do.pl file has the following single line:
1488
1489     return 3;
1490
1491 Running doit.pl gives the following:
1492
1493     # perl 4 prints: 3 (aborts the subroutine early)
1494     # perl 5 prints: 8
1495
1496 Same behavior if you replace C<do> with C<require>.
1497
1498 =item * C<split> on empty string with LIMIT specified
1499
1500         $string = '';
1501     @list = split(/foo/, $string, 2)
1502
1503 Perl4 returns a one element list containing the empty string but Perl5
1504 returns an empty list.
1505
1506 =back
1507
1508 As always, if any of these are ever officially declared as bugs,
1509 they'll be fixed and removed.
1510