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