X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperltrap.pod;h=50987cb102bf155a455a64da2a30e54a19eded5d;hb=9741dab02becad0550bba7d5ca9e59f8ac608b2d;hp=d35abddcba836668a909b9cdbf461de7dbffc1b5;hpb=9bf4ea843f7631689691908b2ccde8f571b18cde;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perltrap.pod b/pod/perltrap.pod index d35abdd..50987cb 100644 --- a/pod/perltrap.pod +++ b/pod/perltrap.pod @@ -22,7 +22,7 @@ The English module, loaded via use English; allows you to refer to special variables (like C<$/>) with names (like -C<$RS>), as though they were in B; see L for details. +$RS), as though they were in B; see L for details. =item * @@ -160,7 +160,7 @@ You must use C rather than C. The C and C keywords from C become in Perl C and C, respectively. -Unlike in C, these do I work within a C construct. +Unlike in C, these do I work within a C construct. =item * @@ -305,7 +305,7 @@ file read is the sole condition in a while loop: =item * -Remember not to use "C<=>" when you need "C<=~>"; +Remember not to use C<=> when you need C<=~>; these two constructs are quite different: $x = /foo/; @@ -451,8 +451,8 @@ Also see precedence traps, for parsing C<$:>. The second and third arguments of C are now evaluated in scalar context (as the Camel says) rather than list context. - sub sub1{return(0,2) } # return a 2-elem array - sub sub2{ return(1,2,3)} # return a 3-elem array + sub sub1{return(0,2) } # return a 2-element list + sub sub2{ return(1,2,3)} # return a 3-element list @a1 = ("a","b","c","d","e"); @a2 = splice(@a1,&sub1,&sub2); print join(' ',@a2),"\n"; @@ -650,6 +650,23 @@ Better parsing in perl 5 # perl4 prints: is zero # perl5 warns: "Useless use of a constant in void context" if using -w +=item * Parsing + +String interpolation of the C<$#array> construct differs when braces +are to used around the name. + + @ = (1..3); + print "${#a}"; + + # perl4 prints: 2 + # perl5 fails with syntax error + + @ = (1..3); + print "$#{a}"; + + # perl4 prints: {a} + # perl5 prints: 2 + =back =head2 Numerical Traps @@ -744,6 +761,9 @@ Hashes get defined before use # perl4 prints: # perl5 dies: hash %h defined +Perl will now generate a warning when it sees defined(@a) and +defined(%h). + =item * (Globs) glob assignment from variable to variable will fail if the assigned @@ -757,15 +777,11 @@ variable is localized subsequent to the assignment # perl4 prints: This is Perl 4 # perl5 prints: - # Another example - - *fred = *barney; # fred is aliased to barney - @barney = (1, 2, 4); - # @fred; - print "@fred"; # should print "1, 2, 4" +=item * (Globs) - # perl4 prints: 1 2 4 - # perl5 prints: In string, @fred now must be written as \@fred +Assigning C to a glob has no effect in Perl 5. In Perl 4 +it undefines the associated scalar (but may have other side effects +including SEGVs). =item * (Scalar String) @@ -925,6 +941,10 @@ Probably a bug. Perl4-to-Perl5 traps involving precedence order. +Perl 4 has almost the same precedence rules as Perl 5 for the operators +that they both have. Perl 4 however, seems to have had some +inconsistencies that made the behavior differ from what was documented. + =over 5 =item * Precedence @@ -1000,13 +1020,34 @@ treats C<$::> as main C =item * Precedence -concatenation precedence over filetest operator? +perl4 had buggy precedence for the file test operators vis-a-vis +the assignment operators. Thus, although the precedence table +for perl4 leads one to believe C<-e $foo .= "q"> should parse as +C<((-e $foo) .= "q")>, it actually parses as C<(-e ($foo .= "q"))>. +In perl5, the precedence is as documented. -e $foo .= "q" # perl4 prints: no output # perl5 prints: Can't modify -e in concatenation +=item * Precedence + +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 +operators. As documented, named unary operators have lower precedence +than the arithmetic and concatenation operators C<+ - .>, but the perl4 +variants of these operators actually bind tighter than C<+ - .>. +Thus, for: + + %foo = 1..10; + print keys %foo - 1 + + # perl4 prints: 4 + # perl5 prints: Type of arg 1 to keys must be hash (not subtraction) + +The perl4 behavior was probably more useful, if less consistent. + =back =head2 General Regular Expression Traps using s///, etc. @@ -1018,7 +1059,7 @@ All types of RE traps. =item * Regular Expression C now does no interpolation on either side. It used to -interpolate C<$lhs> but not C<$rhs>. (And still does not match a literal +interpolate $lhs but not $rhs. (And still does not match a literal '$' in string) $a=1;$b=2; @@ -1057,7 +1098,7 @@ the very first time in any such closure. For instance, if you say } build_match() will always return a sub which matches the contents of -C<$left> and C<$right> as they were the I time that build_match() +$left and $right as they were the I time that build_match() was called, not as they are in the current call. This is probably a bug, and may change in future versions of Perl. @@ -1140,26 +1181,6 @@ repeatedly, like C or C. # perl5 prints: perl5 -=item * Regular Expression - -Under perl4 and upto version 5.003, a failed C match used to -reset the internal iterator, so that subsequent C match attempts -began from the beginning of the string. In perl version 5.004 and later, -failed C matches do not reset the iterator position (which can be -found using the C function--see L). - - $test = "foop"; - for (1..3) { - print $1 while ($test =~ /(o)/g); - # pos $test = 0; # to get old behavior - } - - # perl4 prints: oooooo - # perl5.004 prints: oo - -You may always reset the iterator yourself as shown in the commented line -to get the old behavior. - =back =head2 Subroutine, Signal, Sorting Traps @@ -1309,7 +1330,7 @@ Note that you can C to ward off such trappiness under perl5. =item * Interpolation The construct "this is $$x" used to interpolate the pid at that -point, but now apparently tries to dereference C<$x>. C<$$> by itself still +point, but now apparently tries to dereference $x. C<$$> by itself still works fine, however. print "this is $$x\n"; @@ -1451,9 +1472,7 @@ Everything else. =over 5 -=item * Unclassified - -C/C trap using returned value +=item * C/C trap using returned value If the file doit.pl has: @@ -1474,6 +1493,14 @@ Running doit.pl gives the following: Same behavior if you replace C with C. +=item * C on empty string with LIMIT specified + + $string = ''; + @list = split(/foo/, $string, 2) + +Perl4 returns a one element list containing the empty string but Perl5 +returns an empty list. + =back As always, if any of these are ever officially declared as bugs,