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