Attempt to fix problems with new exception handling macros.
[p5sagit/p5-mst-13.2.git] / pod / perltrap.pod
index f278fa0..0ad0086 100644 (file)
@@ -4,10 +4,11 @@ perltrap - Perl traps for the unwary
 
 =head1 DESCRIPTION
 
-The biggest trap of all is forgetting to use the B<-w> switch; see
-L<perlrun>.  The second biggest trap is not making your entire program
-runnable under C<use strict>.  The third biggest trap is not reading
-the list of changes in this version of Perl; see L<perldelta>.
+The biggest trap of all is forgetting to C<use warnings> or use the B<-w>
+switch; see L<perllexwarn> and L<perlrun>. The second biggest trap is not
+making your entire program runnable under C<use strict>.  The third biggest
+trap is not reading the list of changes in this version of Perl; see
+L<perldelta>.
 
 =head2 Awk Traps
 
@@ -17,6 +18,11 @@ Accustomed B<awk> users should take special note of the following:
 
 =item *
 
+A Perl program executes only once, not once for each input line.  You can
+do an implicit loop with C<-n> or C<-p>.
+
+=item *
+
 The English module, loaded via
 
     use English;
@@ -69,7 +75,7 @@ executed.)  See L<perlvar>.
 
 =item *
 
-$E<lt>I<digit>E<gt> does not refer to fields--it refers to substrings matched
+$<I<digit>> does not refer to fields--it refers to substrings matched
 by the last match pattern.
 
 =item *
@@ -103,7 +109,7 @@ basically incompatible with C.)
 The concatenation operator is ".", not the null string.  (Using the
 null string would render C</pat/ /pat/> unparsable, because the third slash
 would be interpreted as a division operator--the tokenizer is in fact
-slightly context sensitive for operators like "/", "?", and "E<gt>".
+slightly context sensitive for operators like "/", "?", and ">".
 And in fact, "." itself can be the beginning of a number.)
 
 =item *
@@ -116,7 +122,7 @@ The C<next>, C<exit>, and C<continue> keywords work differently.
 The following variables work differently:
 
       Awk      Perl
-      ARGC     $#ARGV or scalar @ARGV
+      ARGC     scalar @ARGV (compare with $#ARGV)
       ARGV[0]  $0
       FILENAME $ARGV
       FNR      $. - something
@@ -142,9 +148,9 @@ gives you.
 
 =back
 
-=head2 C Traps
+=head2 C/C++ Traps
 
-Cerebral C programmers should take note of the following:
+Cerebral C and C++ programmers should take note of the following:
 
 =over 4
 
@@ -158,13 +164,14 @@ You must use C<elsif> rather than C<else if>.
 
 =item *
 
-The C<break> and C<continue> keywords from C become in
-Perl C<last> and C<next>, respectively.
-Unlike in C, these do I<not> work within a C<do { } while> construct.
+The C<break> and C<continue> keywords from C become in Perl C<last>
+and C<next>, respectively.  Unlike in C, these do I<not> work within a
+C<do { } while> construct.  See L<perlsyn/"Loop Control">.
 
 =item *
 
-There's no switch statement.  (But it's easy to build one on the fly.)
+There's no switch statement.  (But it's easy to build one on the fly,
+see L<perlsyn/"Basic BLOCKs and Switch Statements">)
 
 =item *
 
@@ -172,13 +179,9 @@ Variables begin with "$", "@" or "%" in Perl.
 
 =item *
 
-C<printf()> does not implement the "*" format for interpolating
-field widths, but it's trivial to use interpolation of double-quoted
-strings to achieve the same effect.
-
-=item *
-
-Comments begin with "#", not "/*".
+Comments begin with "#", not "/*" or "//".  Perl may interpret C/C++
+comments as division operators, unterminated regular expressions or
+the defined-or operator.
 
 =item *
 
@@ -193,7 +196,7 @@ ends up in C<$0>.
 =item *
 
 System calls such as link(), unlink(), rename(), etc. return nonzero for
-success, not 0.
+success, not 0. (system(), however, returns zero for success.)
 
 =item *
 
@@ -210,6 +213,11 @@ Seasoned B<sed> programmers should take note of the following:
 
 =item *
 
+A Perl program executes only once, not once for each input line.  You can
+do an implicit loop with C<-n> or C<-p>.
+
+=item *
+
 Backreferences in substitutions use "$" rather than "\".
 
 =item *
@@ -259,6 +267,13 @@ The arguments are available via @ARGV, not $1, $2, etc.
 The environment is not automatically made available as separate scalar
 variables.
 
+=item *
+
+The shell's C<test> uses "=", "!=", "<" etc for string comparisons and "-eq",
+"-ne", "-lt" etc for numeric comparisons. This is the reverse of Perl, which
+uses C<eq>, C<ne>, C<lt> for string comparisons, and C<==>, C<!=> C<< < >> etc
+for numeric comparisons.
+
 =back
 
 =head2 Perl Traps
@@ -284,8 +299,8 @@ parentheses on function calls, you won't ever get them confused.
 You cannot discern from mere inspection which builtins
 are unary operators (like chop() and chdir())
 and which are list operators (like print() and unlink()).
-(User-defined subroutines can be B<only> list operators, never
-unary ones.)  See L<perlop>.
+(Unless prototyped, user-defined subroutines can B<only> be list
+operators, never unary ones.)  See L<perlop> and L<perlsub>.
 
 =item *
 
@@ -295,7 +310,7 @@ you might expect to do not.
 
 =item *
 
-The E<lt>FHE<gt> construct is not the name of the filehandle, it is a readline
+The <FH> construct is not the name of the filehandle, it is a readline
 operation on that handle.  The data read is assigned to $_ only if the
 file read is the sole condition in a while loop:
 
@@ -392,8 +407,9 @@ Everything else.
 =back
 
 If you find an example of a conversion trap that is not listed here,
-please submit it to Bill Middleton <F<wjm@best.com>> for inclusion.
-Also note that at least some of these can be caught with B<-w>.
+please submit it to <F<perlbug@perl.org>> for inclusion.
+Also note that at least some of these can be caught with the
+C<use warnings> pragma or the B<-w> switch.
 
 =head2 Discontinuance, Deprecation, and BugFix traps
 
@@ -424,7 +440,7 @@ behave differently in perl4 vs. perl5, because the packages don't exist.
     $a=1;$b=2;$c=3;$var=4;
     print "$a::$b::$c ";
     print "$var::abc::xyz\n";
+
     # perl4 prints: 1::2::3 4::abc::xyz
     # perl5 prints: 3
 
@@ -472,7 +488,7 @@ You can't do a C<goto> into a block that is optimized away.  Darn.
     }
 
     # perl4 prints: Here I is!
-    # perl5 dumps core (SEGV)
+    # perl5 errors: Can't "goto" into the middle of a foreach loop
 
 =item * Discontinuance
 
@@ -591,6 +607,12 @@ Some error messages will be different.
 
 =item * Discontinuance
 
+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
+
 Some bugs may have been inadvertently removed.  :-)
 
 =back
@@ -637,7 +659,7 @@ Better parsing in perl 5
 String interpolation of the C<$#array> construct differs when braces
 are to used around the name.
 
-    @ = (1..3);
+    @a = (1..3);
     print "${#a}";
 
     # perl4 prints: 2
@@ -649,6 +671,16 @@ are to used around the name.
     # perl4 prints: {a}
     # perl5 prints: 2
 
+=item * Parsing
+
+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
+a syntax error near the C<}> and the missing (or unexpected) comma.
+
+Use unary C<+> before C<{> on a hash reference, and unary C<+> applied
+to the first thing in a BLOCK (after C<{>), for perl to guess right all
+the time. (See L<perlfunc/map>.)
+
 =back
 
 =head2 Numerical Traps
@@ -660,18 +692,24 @@ operands, or output from same.
 
 =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:
 
     print 7.373504 - 0, "\n";
     printf "%20.18f\n", 7.373504 - 0;
 
     # Perl4 prints:
-    7.375039999999996141
-    7.37503999999999614
+    7.3750399999999996141
+    7.375039999999999614
 
     # Perl5 prints:
     7.373504
-    7.37503999999999614
+    7.375039999999999614
+
+Notice how the first result looks better in Perl 5.
+
+Your results may vary, since your floating point formatting routines
+and even floating point format may be slightly different.
 
 =item * Numerical
 
@@ -686,7 +724,7 @@ If in doubt:
 
 Assignment of return values from numeric equality tests
 does not work in perl5 when the test evaluates to false (0).
-Logical tests now return an null, instead of 0
+Logical tests now return a null, instead of 0
 
     $p = ($test == 1);
     print $p,"\n";
@@ -787,7 +825,19 @@ variable is localized subsequent to the assignment
 
 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
-including SEGVs).
+including SEGVs). Perl 5 will also warn if C<undef> is assigned to a
+typeglob. (Note that assigning C<undef> to a typeglob is different
+than calling the C<undef> function on a typeglob (C<undef *foo>), which
+has quite a few effects.
+
+    $foo = "bar";
+    *foo = undef;
+    print $foo;
+
+    # perl4 prints:
+    # perl4 warns: "Use of uninitialized variable" if using -w
+    # perl5 prints: bar
+    # perl5 warns: "Undefined value assigned to typeglob" if using -w
 
 =item * (Scalar String)
 
@@ -921,26 +971,25 @@ scalar context to its arguments.
 
 =item * (list, builtin)
 
-C<sprintf()> funkiness (array argument converted to scalar array count)
-This test could be added to t/op/sprintf.t
+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,
+unlike Perl 4:
 
     @z = ('%s%s', 'foo', 'bar');
     $x = sprintf(@z);
-    if ($x eq 'foobar') {print "ok 2\n";} else {print "not ok 2 '$x'\n";}
+    print $x;
 
-    # perl4 prints: ok 2
-    # perl5 prints: not ok 2
+    # perl4 prints: foobar
+    # perl5 prints: 3
 
-C<printf()> works fine, though:
+C<printf()> works the same as it did in Perl 4, though:
 
+    @z = ('%s%s', 'foo', 'bar');
     printf STDOUT (@z);
-    print "\n";
 
     # perl4 prints: foobar
     # perl5 prints: foobar
 
-Probably a bug.
-
 =back
 
 =head2 Precedence Traps
@@ -1012,7 +1061,7 @@ Otherwise, perl5 leaves the statement as its default precedence:
     open(FOO || die);
 
     # perl4 opens or dies
-    # perl5 errors: Precedence problem: open FOO should be open(FOO)
+    # perl5 opens FOO, dying only if 'FOO' is false, i.e. never
 
 =item * Precedence
 
@@ -1088,7 +1137,7 @@ state of the searched string is lost)
     }
     sub doit{local($_) = shift; print "Got $_ "}
 
-    # perl4 prints: blah blah blah
+    # perl4 prints: Got blah Got blah Got blah Got blah
     # perl5 prints: infinite loop blah...
 
 =item * Regular Expression
@@ -1102,13 +1151,21 @@ the very first time in any such closure.  For instance, if you say
         my($left,$right) = @_;
         return sub { $_[0] =~ /$left stuff $right/o; };
     }
+    $good = build_match('foo','bar');
+    $bad = build_match('baz','blarch');
+    print $good->('foo stuff bar') ? "ok\n" : "not ok\n";
+    print $bad->('baz stuff blarch') ? "ok\n" : "not ok\n";
+    print $bad->('foo stuff bar') ? "not ok\n" : "ok\n";
+
+For most builds of Perl5, this will print:
+ok
+not ok
+not ok
 
 build_match() will always return a sub which matches the contents of
 $left and $right as they were the I<first> 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.
-
 =item * Regular Expression
 
 If no parentheses are used in a match, Perl4 sets C<$+> to
@@ -1186,6 +1243,10 @@ repeatedly, like C</x/> or C<m!x!>.
     # perl4 prints: perl4
     # perl5 prints: perl5
 
+=item * Regular Expression
+
+Unlike in Ruby, failed matches in Perl do not reset the match variables
+($1, $2, ..., C<$`>, ...).
 
 =back
 
@@ -1206,8 +1267,8 @@ calls if a subroutine by that name is defined before the compiler sees them.
     $SIG{'TERM'} = SeeYa;
     print "SIGTERM is now $SIG{'TERM'}\n";
 
-    # perl4 prints: SIGTERM is main'SeeYa
-    # perl5 prints: SIGTERM is now main::1
+    # perl4 prints: SIGTERM is now main'SeeYa
+    # perl5 prints: SIGTERM is now main::1 (and warns "Hasta la vista, baby!")
 
 Use B<-w> to catch this one
 
@@ -1216,10 +1277,11 @@ Use B<-w> to catch this one
 reverse is no longer allowed as the name of a sort subroutine.
 
     sub reverse{ print "yup "; $a <=> $b }
-    print sort reverse a,b,c;
+    print sort reverse (2,1,3);
 
-    # perl4 prints: yup yup yup yup abc
-    # perl5 prints: abc
+    # perl4 prints: yup yup 123
+    # perl5 prints: 123
+    # perl5 warns (if using -w): Ambiguous call resolved as CORE::reverse()
 
 =item * warn() won't let you specify a filehandle.
 
@@ -1266,7 +1328,7 @@ Since version 5.002, Perl uses sigaction() under SysV.
 
 =item * (SysV)
 
-Under SysV OSes, C<seek()> on a file opened to append C<E<gt>E<gt>> now does
+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
 for append,  it  is  impossible to overwrite information already in
 the file.
@@ -1301,17 +1363,17 @@ within certain expressions, statements, contexts, or whatever.
     print "To: someone@somewhere.com\n";
 
     # perl4 prints: To:someone@somewhere.com
-    # perl5 errors : In string, @somewhere now must be written as \@somewhere
+    # perl < 5.6.1, error : In string, @somewhere now must be written as \@somewhere
+    # perl >= 5.6.1, warning : Possible unintended interpolation of @somewhere in string
 
 =item * Interpolation
 
-Double-quoted strings may no longer end with an unescaped $ or @.
+Double-quoted strings may no longer end with an unescaped $.
 
     $foo = "foo$";
-    $bar = "bar@";
-    print "foo is $foo, bar is $bar\n";
+    print "foo is $foo\n";
 
-    # perl4 prints: foo is foo$, bar is bar@
+    # perl4 prints: foo is foo$
     # perl5 errors: Final $ should be \$ or $name
 
 Note: perl5 DOES NOT error on the terminating @ in $bar
@@ -1335,14 +1397,15 @@ Note that you can C<use strict;> 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 $x.  C<$$> by itself still
-works fine, however.
+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.
 
+    $s = "a reference";
+    $x = *s;
     print "this is $$x\n";
 
     # perl4 prints: this is XXXx   (XXX is the current pid)
-    # perl5 prints: this is
+    # perl5 prints: this is a reference
 
 =item * Interpolation
 
@@ -1396,25 +1459,38 @@ perl4 programs which unconsciously rely on the bugs in earlier perl versions.
 
 =item * Interpolation
 
-You also have to be careful about array references.
+You also have to be careful about array and hash brackets during
+interpolation.
+
+    print "$foo["
+
+    perl 4 prints: [
+    perl 5 prints: syntax error
 
     print "$foo{"
 
     perl 4 prints: {
     perl 5 prints: syntax error
 
+Perl 5 is expecting to find an index or key name following the respective
+brackets, as well as an ending bracket of the appropriate type.  In order
+to mimic the behavior of Perl 4, you must escape the bracket like so.
+
+    print "$foo\[";
+    print "$foo\{";
+
 =item * Interpolation
 
 Similarly, watch out for:
 
-    $foo = "array";
+    $foo = "baz";
     print "\$$foo{bar}\n";
 
-    # perl4 prints: $array{bar}
+    # perl4 prints: $baz{bar}
     # perl5 prints: $
 
-Perl 5 is looking for C<$array{bar}> which doesn't exist, but perl 4 is
-happy just to expand $foo to "array" by itself.  Watch out for this
+Perl 5 is looking for C<$foo{bar}> which doesn't exist, but perl 4 is
+happy just to expand $foo to "baz" by itself.  Watch out for this
 especially in C<eval>'s.
 
 =item * Interpolation
@@ -1501,7 +1577,7 @@ Same behavior if you replace C<do> with C<require>.
 
 =item * C<split> on empty string with LIMIT specified
 
-       $string = '';
+    $string = '';
     @list = split(/foo/, $string, 2)
 
 Perl4 returns a one element list containing the empty string but Perl5