On 31 Mar, Michael G Schwern wrote: : On Thu, Mar 31, 2005 at 08:40:35PM -0000, Dan Jacobson wrote: :> P.S., perltoc looks funny, :> Precedence Traps :> Precedence, Precedence, Precedence, Precedence, Precedence, :> Precedence, Precedence : : Yes, this due to the perltrap man page not using terribly descriptive : section headers. That should be fixed. Good catch.
Inline attached is a patch. Steven Schubiger --- bleadperl/pod/perltrap.pod Tue Dec 21 13:29:36 2004 +++ perltrap.pod Fri Apr 1 19:01:44 2005 @@ -418,7 +418,7 @@ =over 4 -=item * Discontinuance +=item * Discontinuance C<_> Symbols starting with "_" are no longer forced into package main, except for C<$_> itself (and C<@_>, etc.). @@ -432,7 +432,7 @@ # perl4 prints: $_legacy is 1 # perl5 prints: $_legacy is -=item * Deprecation +=item * Deprecation C<::> Double-colon is now a valid package separator in a variable name. Thus these behave differently in perl4 vs. perl5, because the packages don't exist. @@ -462,7 +462,7 @@ Also see precedence traps, for parsing C<$:>. -=item * BugFix +=item * BugFix C<splice()> The second and third arguments of C<splice()> are now evaluated in scalar context (as the Camel says) rather than list context. @@ -476,7 +476,7 @@ # perl4 prints: a b # perl5 prints: c d e -=item * Discontinuance +=item * Discontinuance C<goto> You can't do a C<goto> into a block that is optimized away. Darn. @@ -490,7 +490,7 @@ # perl4 prints: Here I is! # perl5 errors: Can't "goto" into the middle of a foreach loop -=item * Discontinuance +=item * Discontinuance whitespace as the name of a variable It is no longer syntactically legal to use whitespace as the name of a variable, or as a delimiter for any kind of quote construct. @@ -503,7 +503,7 @@ # perl4 prints: a is foo bar, b is baz # perl5 errors: Bareword found where operator expected -=item * Discontinuance +=item * Discontinuance C<while/if BLOCK BLOCK> The archaic while/if BLOCK BLOCK syntax is no longer supported. @@ -517,7 +517,7 @@ # perl4 prints: True! # perl5 errors: syntax error at test.pl line 1, near "if {" -=item * BugFix +=item * BugFix C<**> The C<**> operator now binds more tightly than unary minus. It was documented to work this way before, but didn't. @@ -527,7 +527,7 @@ # perl4 prints: 16 # perl5 prints: -16 -=item * Discontinuance +=item * Discontinuance C<foreach{}> The meaning of C<foreach{}> has changed slightly when it is iterating over a list which is not an array. This used to assign the list to a @@ -559,7 +559,7 @@ happens when you use C<$_> for the loop variable, and call subroutines in the loop that don't properly localize C<$_>.) -=item * Discontinuance +=item * Discontinuance C<split> C<split> with no arguments now behaves like C<split ' '> (which doesn't return an initial null field if $_ starts with whitespace), it used to @@ -571,7 +571,7 @@ # perl4 prints: :hi:mom # perl5 prints: hi:mom -=item * BugFix +=item * BugFix B<-e> Perl 4 would ignore any text which was attached to an B<-e> switch, always taking the code snippet from the following arg. Additionally, it @@ -588,7 +588,7 @@ # perl4 prints: # perl5 dies: No code specified for -e. -=item * Discontinuance +=item * Discontinuance return value C<push> In Perl 4 the return value of C<push> was undocumented, but it was actually the last value being pushed onto the target list. In Perl 5 @@ -601,17 +601,17 @@ # perl4 prints: second new # perl5 prints: 3 -=item * Deprecation +=item * Deprecation error messages Some error messages will be different. -=item * Discontinuance +=item * Discontinuance C<split()> In Perl 4, if in list context the delimiters to the first argument of C<split()> were C<??>, the result would be placed in C<@_> as well as being returned. Perl 5 has more respect for your subroutine arguments. -=item * Discontinuance +=item * Discontinuance bugs Some bugs may have been inadvertently removed. :-) @@ -623,7 +623,7 @@ =over 4 -=item * Parsing +=item * Parsing space between . and = Note the space between . and = @@ -633,7 +633,7 @@ # perl4 prints: more string # perl5 prints: syntax error at - line 1, near ". =" -=item * Parsing +=item * Parsing perl 5 Better parsing in perl 5 @@ -644,7 +644,7 @@ # perl4 prints: hello, world # perl5 prints: syntax error -=item * Parsing +=item * Parsing function "if it looks like a function, it is a function" rule. @@ -654,7 +654,7 @@ # perl4 prints: is zero # perl5 warns: "Useless use of a constant in void context" if using -w -=item * Parsing +=item * Parsing C<$#array> String interpolation of the C<$#array> construct differs when braces are to used around the name. @@ -671,7 +671,7 @@ # perl4 prints: {a} # perl5 prints: 2 -=item * Parsing +=item * Parsing C<map>, C<grep> When perl sees C<map {> (or C<grep {>), it has to guess whether the C<{> starts a BLOCK or a hash reference. If it guesses wrong, it will report @@ -690,7 +690,7 @@ =over 5 -=item * Numerical +=item * Numerical formatted output and significant digits Formatted output and significant digits. In general, Perl 5 tries to be more precise. For example, on a Solaris Sparc: @@ -711,7 +711,7 @@ Your results may vary, since your floating point formatting routines and even floating point format may be slightly different. -=item * Numerical +=item * Numerical auto-increment operator This specific item has been deleted. It demonstrated how the auto-increment operator would not catch when a number went over the signed int limit. Fixed @@ -720,7 +720,7 @@ use Math::BigInt; -=item * Numerical +=item * Numerical return values from numeric equality tests Assignment of return values from numeric equality tests does not work in perl5 when the test evaluates to false (0). @@ -768,7 +768,7 @@ =over 5 -=item * (Arrays) +=item * (Arrays) negative array subscripts Negative array subscripts now count from the end of the array. @@ -778,7 +778,7 @@ # perl4 prints: The third element of the array is 4 also expressed as # perl5 prints: The third element of the array is 4 also expressed as 4 -=item * (Arrays) +=item * (Arrays) setting C<$#array> lower Setting C<$#array> lower now discards array elements, and makes them impossible to recover. @@ -793,7 +793,7 @@ # perl4 prints: Before: abcde, After: ab, Recovered: abcd # perl5 prints: Before: abcde, After: ab, Recovered: ab -=item * (Hashes) +=item * (Hashes) defined before use Hashes get defined before use @@ -808,7 +808,7 @@ Perl will now generate a warning when it sees defined(@a) and defined(%h). -=item * (Globs) +=item * (Globs) assignment from localized variable to variable glob assignment from variable to variable will fail if the assigned variable is localized subsequent to the assignment @@ -821,7 +821,7 @@ # perl4 prints: This is Perl 4 # perl5 prints: -=item * (Globs) +=item * (Globs) assigning C<undef> Assigning C<undef> to a glob has no effect in Perl 5. In Perl 4 it undefines the associated scalar (but may have other side effects @@ -839,7 +839,7 @@ # perl5 prints: bar # perl5 warns: "Undefined value assigned to typeglob" if using -w -=item * (Scalar String) +=item * (Scalar String) unary negation Changes in unary negation (of strings) This change effects both the return value and what it @@ -853,7 +853,7 @@ # perl4 prints: aab : -0 : 1 # perl5 prints: aab : -aab : aac -=item * (Constants) +=item * (Constants) modify constants perl 4 lets you modify constants: @@ -879,7 +879,7 @@ # Modification of a read-only value attempted at foo.pl line 12. # before: a -=item * (Scalars) +=item * (Scalars) defined $var The behavior is slightly different for: @@ -931,7 +931,7 @@ =over 5 -=item * (list context) +=item * (list context) formats evaluated in list context The elements of argument lists for formats are now evaluated in list context. This means you can interpolate list values now. @@ -946,7 +946,7 @@ # perl4 errors: Please use commas to separate fields in file # perl5 prints: foo bar baz -=item * (scalar context) +=item * (scalar context) C<caller> return value The C<caller()> function now returns a false value in a scalar context if there is no caller. This lets library files determine if they're @@ -957,7 +957,7 @@ # perl4 errors: There is no caller # perl5 prints: Got a 0 -=item * (scalar context) +=item * (scalar context) comma operator The comma operator in a scalar context is now guaranteed to give a scalar context to its arguments. @@ -969,7 +969,7 @@ # Perl4 prints: x = c # Thinks list context interpolates list # Perl5 prints: x = 3 # Knows scalar uses length of list -=item * (list, builtin) +=item * (list, builtin) C<sprintf()> prototype C<sprintf()> is prototyped as ($;@), so its first argument is given scalar context. Thus, if passed an array, it will probably not do what you want, @@ -1002,7 +1002,7 @@ =over 5 -=item * Precedence +=item * Precedence LHS vs. RHS LHS vs. RHS of any assignment operator. LHS is evaluated first in perl4, second in perl5; this can affect the relationship @@ -1015,7 +1015,7 @@ # perl4 prints: left # perl5 prints: right -=item * Precedence +=item * Precedence semantic errors These are now semantic errors because of precedence: @@ -1029,7 +1029,7 @@ # perl4 prints: n is 3, m is 6 # perl5 errors and fails to compile -=item * Precedence +=item * Precedence assignment operators The precedence of assignment operators is now the same as the precedence of assignment. Perl 4 mistakenly gave them the precedence of the associated @@ -1051,7 +1051,7 @@ now works as a C programmer would expect. -=item * Precedence +=item * Precedence C<open> open FOO || die; @@ -1063,7 +1063,7 @@ # perl4 opens or dies # perl5 opens FOO, dying only if 'FOO' is false, i.e. never -=item * Precedence +=item * Precedence C<$:> perl4 gives the special variable, C<$:> precedence, where perl5 treats C<$::> as main C<package> @@ -1073,7 +1073,7 @@ # perl 4 prints: -:a # perl 5 prints: x -=item * Precedence +=item * Precedence file test operators perl4 had buggy precedence for the file test operators vis-a-vis the assignment operators. Thus, although the precedence table @@ -1086,7 +1086,7 @@ # perl4 prints: no output # perl5 prints: Can't modify -e in concatenation -=item * Precedence +=item * Precedence C<keys>, C<each>, C<values> In perl4, keys(), each() and values() were special high-precedence operators that operated on a single hash, but in perl5, they are regular named unary @@ -1111,7 +1111,7 @@ =over 5 -=item * Regular Expression +=item * Regular Expression C<s'$lhs'$rhs'> C<s'$lhs'$rhs'> now does no interpolation on either side. It used to interpolate $lhs but not $rhs. (And still does not match a literal @@ -1125,7 +1125,7 @@ # perl4 prints: $b 2 $a $b # perl5 prints: 1 2 $a $b -=item * Regular Expression +=item * Regular Expression C<m//g> C<m//g> now attaches its state to the searched string rather than the regular expression. (Once the scope of a block is left for the sub, the @@ -1140,7 +1140,7 @@ # perl4 prints: Got blah Got blah Got blah Got blah # perl5 prints: infinite loop blah... -=item * Regular Expression +=item * Regular Expression C<m//o> Currently, if you use the C<m//o> qualifier on a regular expression within an anonymous sub, I<all> closures generated from that anonymous @@ -1166,7 +1166,7 @@ $left and $right as they were the I<first> time that build_match() was called, not as they are in the current call. -=item * Regular Expression +=item * Regular Expression C<$+> If no parentheses are used in a match, Perl4 sets C<$+> to the whole match, just like C<$&>. Perl5 does not. @@ -1177,7 +1177,7 @@ # perl4 prints: bcde # perl5 prints: -=item * Regular Expression +=item * Regular Expression substitution returns null string substitution now returns the null string if it fails @@ -1190,7 +1190,7 @@ Also see L<Numerical Traps> for another example of this new feature. -=item * Regular Expression +=item * Regular Expression C<s`lhs`rhs`> C<s`lhs`rhs`> (using backticks) is now a normal substitution, with no backtick expansion @@ -1202,7 +1202,7 @@ # perl4 prints: <the local hostname> # perl5 prints: hostname -=item * Regular Expression +=item * Regular Expression stricter parsing of variables Stricter parsing of variables used in regular expressions @@ -1224,7 +1224,7 @@ # perl4 prints: foo # perl5 prints: foobar -=item * Regular Expression +=item * Regular Expression C<m?x?> Under perl5, C<m?x?> matches only once, like C<?x?>. Under perl4, it matched repeatedly, like C</x/> or C<m!x!>. @@ -1243,7 +1243,7 @@ # perl4 prints: perl4 # perl5 prints: perl5 -=item * Regular Expression +=item * Regular Expression reset match variables Unlike in Ruby, failed matches in Perl do not reset the match variables ($1, $2, ..., C<$`>, ...). @@ -1299,7 +1299,7 @@ =over 5 -=item * (SysV) +=item * (SysV) reset signal handler Under HPUX, and some other SysV OSes, one had to reset any signal handler, within the signal handler function, each time a signal was handled with @@ -1326,7 +1326,7 @@ # perl4 (HPUX) prints: Got INT... # perl5 (HPUX) prints: Got INT... Got INT... -=item * (SysV) +=item * (SysV) C<seek()> Under SysV OSes, C<seek()> on a file opened to append C<<< >> >>> now does the right thing w.r.t. the fopen() manpage. e.g., - When a file is opened @@ -1356,7 +1356,7 @@ =over 5 -=item * Interpolation +=item * Interpolation @ @ now always interpolates an array in double-quotish strings. @@ -1366,7 +1366,7 @@ # perl < 5.6.1, error : In string, @somewhere now must be written as [EMAIL PROTECTED] # perl >= 5.6.1, warning : Possible unintended interpolation of @somewhere in string -=item * Interpolation +=item * Interpolation strings ended with an unescaped $ Double-quoted strings may no longer end with an unescaped $. @@ -1378,7 +1378,7 @@ Note: perl5 DOES NOT error on the terminating @ in $bar -=item * Interpolation +=item * Interpolation arbitrary expressions Perl now sometimes evaluates arbitrary expressions inside braces that occur within double quotes (usually when the opening brace is preceded by C<$> @@ -1395,7 +1395,7 @@ Note that you can C<use strict;> to ward off such trappiness under perl5. -=item * Interpolation +=item * Interpolation C<$$x> The construct "this is $$x" used to interpolate the pid at that point, but now tries to dereference $x. C<$$> by itself still works fine, however. @@ -1407,7 +1407,7 @@ # perl4 prints: this is XXXx (XXX is the current pid) # perl5 prints: this is a reference -=item * Interpolation +=item * Interpolation creation of hashes on the fly with C<eval "EXPR"> Creation of hashes on the fly with C<eval "EXPR"> now requires either both C<$>'s to be protected in the specification of the hash name, or both curlies @@ -1448,7 +1448,7 @@ # and is compatible for both versions -=item * Interpolation +=item * Interpolation bugs in earlier perl versions perl4 programs which unconsciously rely on the bugs in earlier perl versions. @@ -1457,7 +1457,7 @@ # perl4 prints: This is not perl5 # perl5 prints: This is perl5 -=item * Interpolation +=item * Interpolation array and hash brackets You also have to be careful about array and hash brackets during interpolation. @@ -1479,9 +1479,9 @@ print "$foo\["; print "$foo\{"; -=item * Interpolation +=item * Interpolation C<\$$foo{bar}> -Similarly, watch out for: +Similarly, watch out for: C<\$$foo{bar}> $foo = "baz"; print "\$$foo{bar}\n"; @@ -1493,7 +1493,7 @@ happy just to expand $foo to "baz" by itself. Watch out for this especially in C<eval>'s. -=item * Interpolation +=item * Interpolation C<qq()> C<qq()> string passed to C<eval> @@ -1514,7 +1514,7 @@ =over 5 -=item * DBM +=item * DBM same dbm/ndbm as the default for C<dbmopen()> Existing dbm databases created under perl4 (or any other dbm/ndbm tool) may cause the same script, run under perl5, to fail. The build of perl5 @@ -1528,7 +1528,7 @@ # perl5 prints: ok (IFF linked with -ldbm or -lndbm) -=item * DBM +=item * DBM exceeding the limit on the key/value size Existing dbm databases created under perl4 (or any other dbm/ndbm tool) may cause the same script, run under perl5, to fail. The error generated