Clarify C<crypt> documentation
[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,
394please submit it to Bill Middleton F<wjm@best.com> for inclusion.
395Also note that at least some of these can be caught with C<-w>.
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
553Perl 4 would ignore any text which was attached to an C<-e> switch,
554always taking the code snippet from the following arg. Additionally, it
555would silently accept an C<-e> switch without a following arg. Both of
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
743 # perl5 prints: Literal @fred now requires backslash
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
dfdcb7a0 1140=item * Subroutine calls provide lvalue context to arguments
1141
1142Beginning with version 5.002, all subroutine arguments are consistently
1143given a "value may be modified" context, since all subroutines are able
1144to modify their arguments by explicitly referring to C<$_[0]> etc.
1145This means that any array and hash elements provided as arguments
1146will B<always be created> if they did not exist at the time
1147the subroutine is called. (perl5 versions before 5.002 used to provide
1148lvalue context for the second and subsequent arguments, and perl4 did
1149not provide lvalue context to subroutine arguments at all--even though
1150arguments were supposedly modifiable in perl4).
1151
1152 sub test { $_[0] = 1; $_[1] = 2; $_[2] = 3; }
1153 &test($foo{'bar'}, $bar{'foo'}, $foo[5]);
1154 print join(':', %foo), '|', join(':',%bar), '|', join(':',@foo);
1155
1156 # perl4 prints: ||
1157 # perl5 < 5.002 prints: |foo:2|:::::3
1158 # perl5 >= 5.002 prints: bar:1|foo:2|:::::3
1159
6dbacca0 1160=item * (Signals)
a0d0e21e 1161
6dbacca0 1162Barewords that used to look like strings to Perl will now look like subroutine
1163calls if a subroutine by that name is defined before the compiler sees them.
a0d0e21e 1164
6dbacca0 1165 sub SeeYa { warn"Hasta la vista, baby!" }
1166 $SIG{'TERM'} = SeeYa;
1167 print "SIGTERM is now $SIG{'TERM'}\n";
1168
1169 # perl4 prints: SIGTERM is main'SeeYa
1170 # perl5 prints: SIGTERM is now main::1
a0d0e21e 1171
6dbacca0 1172Use B<-w> to catch this one
a0d0e21e 1173
6dbacca0 1174=item * (Sort Subroutine)
a0d0e21e 1175
6dbacca0 1176reverse is no longer allowed as the name of a sort subroutine.
a0d0e21e 1177
6dbacca0 1178 sub reverse{ print "yup "; $a <=> $b }
1179 print sort reverse a,b,c;
1180
1181 # perl4 prints: yup yup yup yup abc
1182 # perl5 prints: abc
a0d0e21e 1183
b996531f 1184=item * warn() won't let you specify a filehandle.
1185
1186Although it _always_ printed to STDERR, warn() would let you specify a
1187filehandle in perl4. With perl5 it does not.
5e378fdf 1188
1189 warn STDERR "Foo!";
1190
1191 # perl4 prints: Foo!
1192 # perl5 prints: String found where operator expected
1193
6dbacca0 1194=back
a0d0e21e 1195
6dbacca0 1196=head2 OS Traps
1197
1198=over 5
1199
1200=item * (SysV)
1201
1202Under HPUX, and some other SysV OS's, one had to reset any signal handler,
1203within the signal handler function, each time a signal was handled with
1204perl4. With perl5, the reset is now done correctly. Any code relying
1205on the handler _not_ being reset will have to be reworked.
1206
a6006777 1207Since version 5.002, Perl uses sigaction() under SysV.
6dbacca0 1208
1209 sub gotit {
1210 print "Got @_... ";
1211 }
1212 $SIG{'INT'} = 'gotit';
1213
1214 $| = 1;
1215 $pid = fork;
1216 if ($pid) {
1217 kill('INT', $pid);
1218 sleep(1);
1219 kill('INT', $pid);
1220 } else {
1221 while (1) {sleep(10);}
1222 }
1223
1224 # perl4 (HPUX) prints: Got INT...
1225 # perl5 (HPUX) prints: Got INT... Got INT...
1226
1227=item * (SysV)
1228
1229Under SysV OS's, C<seek()> on a file opened to append C<E<gt>E<gt>> now does
5f05dabc 1230the right thing w.r.t. the fopen() man page. e.g., - When a file is opened
6dbacca0 1231for append, it is impossible to overwrite information already in
1232the file.
1233
1234 open(TEST,">>seek.test");
1235 $start = tell TEST ;
1236 foreach(1 .. 9){
1237 print TEST "$_ ";
1238 }
1239 $end = tell TEST ;
1240 seek(TEST,$start,0);
1241 print TEST "18 characters here";
1242
1243 # perl4 (solaris) seek.test has: 18 characters here
1244 # perl5 (solaris) seek.test has: 1 2 3 4 5 6 7 8 9 18 characters here
a0d0e21e 1245
a0d0e21e 1246
a0d0e21e 1247
6dbacca0 1248=back
a0d0e21e 1249
6dbacca0 1250=head2 Interpolation Traps
a0d0e21e 1251
8b0a4b75 1252Perl4-to-Perl5 traps having to do with how things get interpolated
1253within certain expressions, statements, contexts, or whatever.
1254
6dbacca0 1255=over 5
a0d0e21e 1256
6dbacca0 1257=item * Interpolation
a0d0e21e 1258
6dbacca0 1259@ now always interpolates an array in double-quotish strings.
1260
1261 print "To: someone@somewhere.com\n";
1262
1263 # perl4 prints: To:someone@somewhere.com
1264 # perl5 errors : Literal @somewhere now requires backslash
1265
1266=item * Interpolation
1267
6dbacca0 1268Double-quoted strings may no longer end with an unescaped $ or @.
1269
1270 $foo = "foo$";
1271 $bar = "bar@";
1272 print "foo is $foo, bar is $bar\n";
1273
1274 # perl4 prints: foo is foo$, bar is bar@
1275 # perl5 errors: Final $ should be \$ or $name
1276
1277Note: perl5 DOES NOT error on the terminating @ in $bar
1278
1279=item * Interpolation
a0d0e21e 1280
8b0a4b75 1281Perl now sometimes evaluates arbitrary expressions inside braces that occur
1282within double quotes (usually when the opening brace is preceded by C<$>
1283or C<@>).
1284
1285 @www = "buz";
1286 $foo = "foo";
1287 $bar = "bar";
1288 sub foo { return "bar" };
1289 print "|@{w.w.w}|${main'foo}|";
1290
1291 # perl4 prints: |@{w.w.w}|foo|
1292 # perl5 prints: |buz|bar|
1293
1294Note that you can C<use strict;> to ward off such trappiness under perl5.
1295
1296=item * Interpolation
1297
748a9306 1298The construct "this is $$x" used to interpolate the pid at that
6dbacca0 1299point, but now apparently tries to dereference C<$x>. C<$$> by itself still
748a9306 1300works fine, however.
1301
6dbacca0 1302 print "this is $$x\n";
748a9306 1303
6dbacca0 1304 # perl4 prints: this is XXXx (XXX is the current pid)
1305 # perl5 prints: this is
1306
1307=item * Interpolation
1308
1309Creation of hashes on the fly with C<eval "EXPR"> now requires either both
1310C<$>'s to be protected in the specification of the hash name, or both curlies
1311to be protected. If both curlies are protected, the result will be compatible
1312with perl4 and perl5. This is a very common practice, and should be changed
1313to use the block form of C<eval{}> if possible.
c07a80fd 1314
6dbacca0 1315 $hashname = "foobar";
1316 $key = "baz";
1317 $value = 1234;
1318 eval "\$$hashname{'$key'} = q|$value|";
1319 (defined($foobar{'baz'})) ? (print "Yup") : (print "Nope");
1320
1321 # perl4 prints: Yup
1322 # perl5 prints: Nope
1323
1324Changing
1325
1326 eval "\$$hashname{'$key'} = q|$value|";
c07a80fd 1327
1328to
1329
6dbacca0 1330 eval "\$\$hashname{'$key'} = q|$value|";
c07a80fd 1331
6dbacca0 1332causes the following result:
c07a80fd 1333
6dbacca0 1334 # perl4 prints: Nope
1335 # perl5 prints: Yup
c07a80fd 1336
6dbacca0 1337or, changing to
a0d0e21e 1338
6dbacca0 1339 eval "\$$hashname\{'$key'\} = q|$value|";
1340
1341causes the following result:
1342
1343 # perl4 prints: Yup
1344 # perl5 prints: Yup
1345 # and is compatible for both versions
1346
1347
1348=item * Interpolation
1349
1350perl4 programs which unconsciously rely on the bugs in earlier perl versions.
1351
1352 perl -e '$bar=q/not/; print "This is $foo{$bar} perl5"'
1353
1354 # perl4 prints: This is not perl5
1355 # perl5 prints: This is perl5
1356
1357=item * Interpolation
1358
1359You also have to be careful about array references.
1360
1361 print "$foo{"
1362
1363 perl 4 prints: {
1364 perl 5 prints: syntax error
1365
1366=item * Interpolation
1367
1368Similarly, watch out for:
1369
1370 $foo = "array";
1371 print "\$$foo{bar}\n";
1372
1373 # perl4 prints: $array{bar}
1374 # perl5 prints: $
1375
1376Perl 5 is looking for C<$array{bar}> which doesn't exist, but perl 4 is
1377happy just to expand $foo to "array" by itself. Watch out for this
1378especially in C<eval>'s.
1379
1380=item * Interpolation
1381
1382C<qq()> string passed to C<eval>
1383
1384 eval qq(
1385 foreach \$y (keys %\$x\) {
1386 \$count++;
1387 }
1388 );
1389
1390 # perl4 runs this ok
1391 # perl5 prints: Can't find string terminator ")"
a0d0e21e 1392
6dbacca0 1393=back
1394
1395=head2 DBM Traps
1396
1397General DBM traps.
1398
1399=over 5
1400
1401=item * DBM
1402
1403Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
1404may cause the same script, run under perl5, to fail. The build of perl5
1405must have been linked with the same dbm/ndbm as the default for C<dbmopen()>
1406to function properly without C<tie>'ing to an extension dbm implementation.
1407
1408 dbmopen (%dbm, "file", undef);
1409 print "ok\n";
1410
1411 # perl4 prints: ok
1412 # perl5 prints: ok (IFF linked with -ldbm or -lndbm)
1413
1414
1415=item * DBM
1416
1417Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
1418may cause the same script, run under perl5, to fail. The error generated
1419when exceeding the limit on the key/value size will cause perl5 to exit
1420immediately.
1421
1422 dbmopen(DB, "testdb",0600) || die "couldn't open db! $!";
1423 $DB{'trap'} = "x" x 1024; # value too large for most dbm/ndbm
1424 print "YUP\n";
1425
1426 # perl4 prints:
1427 dbm store returned -1, errno 28, key "trap" at - line 3.
1428 YUP
1429
1430 # perl5 prints:
1431 dbm store returned -1, errno 28, key "trap" at - line 3.
a0d0e21e 1432
1433=back
6dbacca0 1434
1435=head2 Unclassified Traps
1436
1437Everything else.
1438
84dc3c4d 1439=over 5
1440
6dbacca0 1441=item * Unclassified
1442
1443C<require>/C<do> trap using returned value
1444
1445If the file doit.pl has:
1446
1447 sub foo {
1448 $rc = do "./do.pl";
1449 return 8;
1450 }
1451 print &foo, "\n";
1452
1453And the do.pl file has the following single line:
1454
1455 return 3;
1456
1457Running doit.pl gives the following:
1458
1459 # perl 4 prints: 3 (aborts the subroutine early)
1460 # perl 5 prints: 8
1461
1462Same behavior if you replace C<do> with C<require>.
1463
1464=back
1465
1466As always, if any of these are ever officially declared as bugs,
1467they'll be fixed and removed.
1468