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