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