This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add 5.12.5 to perlhist
[perl5.git] / pod / perltrap.pod
index 51dac47..ee17470 100644 (file)
@@ -4,13 +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>.  Making your entire program runnable under
-
-    use strict;
-
-can help make your program more bullet-proof, but sometimes
-it's too annoying for quick throw-away programs.
+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
 
@@ -20,12 +18,17 @@ 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;
 
-allows you to refer to special variables (like $RS) as 
-though they were in B<awk>; see L<perlvar> for details.
+allows you to refer to special variables (like C<$/>) with names (like
+$RS), as though they were in B<awk>; see L<perlvar> for details.
 
 =item *
 
@@ -38,7 +41,7 @@ Curly brackets are required on C<if>s and C<while>s.
 
 =item *
 
-Variables begin with "$" or "@" in Perl.
+Variables begin with "$", "@" or "%" in Perl.
 
 =item *
 
@@ -51,8 +54,7 @@ You have to decide whether your array has numeric or string indices.
 
 =item *
 
-Associative array values do not spring into existence upon mere
-reference.
+Hash values do not spring into existence upon mere reference.
 
 =item *
 
@@ -62,8 +64,8 @@ comparisons.
 =item *
 
 Reading an input line does not split it for you.  You get to split it
-yourself to an array.  And split() operator has different
-arguments.
+to an array yourself.  And the split() operator has different
+arguments than B<awk>'s.
 
 =item *
 
@@ -73,13 +75,13 @@ executed.)  See L<perlvar>.
 
 =item *
 
-$<I<digit>> does not refer to fields--it refers to substrings matched by
-the last match pattern.
+$<I<digit>> does not refer to fields--it refers to substrings matched
+by the last match pattern.
 
 =item *
 
 The print() statement does not add field and record separators unless
-you set C<$,> and C<$.>.  You can set $OFS and $ORS if you're using
+you set C<$,> and C<$\>.  You can set $OFS and $ORS if you're using
 the English module.
 
 =item *
@@ -105,8 +107,8 @@ basically incompatible with C.)
 =item *
 
 The concatenation operator is ".", not the null string.  (Using the
-null string would render C</pat/ /pat/> unparsable, since the third slash
-would be interpreted as a division operator--the tokener is in fact
+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 ">".
 And in fact, "." itself can be the beginning of a number.)
 
@@ -120,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
@@ -146,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
 
@@ -162,41 +164,39 @@ 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.
-
-=item *
-
-There's no switch statement.  (But it's easy to build one on the fly.)
+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 *
 
-Variables begin with "$" or "@" in Perl.
+The switch statement is called C<given/when> and only available in
+perl 5.10 or newer.  See L<perlsyn/"Switch Statements">.
 
 =item *
 
-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.
+Variables begin with "$", "@" or "%" in Perl.
 
 =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 *
 
 You can't take the address of anything, although a similar operator
-in Perl is the backslash, which creates a reference.
+in Perl is the backslash, which creates a reference.
 
 =item *
 
-C<ARGV> must be capitalized.
+C<ARGV> must be capitalized.  C<$ARGV[0]> is C's C<argv[1]>, and C<argv[0]>
+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 *
 
@@ -213,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 *
@@ -234,7 +239,7 @@ Sharp shell programmers should take note of the following:
 
 =item *
 
-The backtick operator does variable interpretation without regard to
+The backtick operator does variable interpolation without regard to
 the presence of single quotes in the command.
 
 =item *
@@ -244,7 +249,7 @@ The backtick operator does no translation of the return value, unlike B<csh>.
 =item *
 
 Shells (especially B<csh>) do several levels of substitution on each
-command line.  Perl does substitution only in certain constructs
+command line.  Perl does substitution in only certain constructs
 such as double quotes, backticks, angle brackets, and search patterns.
 
 =item *
@@ -262,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
@@ -277,28 +289,38 @@ context than they do in a scalar one.  See L<perldata> for details.
 
 =item *
 
-Avoid barewords if you can, especially all lower-case ones.
-You can't tell just by looking at it whether a bareword is 
-a function or a string.  By using quotes on strings and 
-parens on function calls, you won't ever get them confused.
+Avoid barewords if you can, especially all lowercase ones.
+You can't tell by just looking at it whether a bareword is
+a function or a string.  By using quotes on strings and
+parentheses on function calls, you won't ever get them confused.
 
 =item *
 
-You cannot discern from mere inspection which built-ins
-are unary operators (like chop() and chdir()) 
+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 B<only> be 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 *
 
-People have a hard type remembering that some functions
+People have a hard time remembering that some functions
 default to $_, or @ARGV, or whatever, but that others which
-you might expect to do not.  
+you might expect to do not.
+
+=item *
+
+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:
+
+    while (<FH>)      { }
+    while (defined($_ = <FH>)) { }..
+    <FH>;  # data discarded!
 
-=item * 
+=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/;
@@ -306,146 +328,25 @@ these two constructs are quite different:
 
 =item *
 
-The C<do {}> construct isn't a real loop that you can use 
+The C<do {}> construct isn't a real loop that you can use
 loop control on.
 
 =item *
 
-Use my() for local variables whenever you can get away with 
-it (but see L<perlform> for where you can't).  
-Using local() actually gives a local value to a global 
+Use C<my()> for local variables whenever you can get away with
+it (but see L<perlform> for where you can't).
+Using C<local()> actually gives a local value to a global
 variable, which leaves you open to unforeseen side-effects
 of dynamic scoping.
 
-=back
-
-=head2 Perl4 Traps
-
-Penitent Perl 4 Programmers should take note of the following
-incompatible changes that occurred between release 4 and release 5:
-
-=over 4
-
-=item *
-
-C<@> now always interpolates an array in double-quotish strings.  Some programs
-may now need to use backslash to protect any C<@> that shouldn't interpolate.
-
-=item *
-Barewords that used to look like strings to Perl will now look like subroutine
-calls if a subroutine by that name is defined before the compiler sees them.
-For example:
-
-    sub SeeYa { die "Hasta la vista, baby!" }
-    $SIG{QUIT} = SeeYa;
-
-In Perl 4, that set the signal handler; in Perl 5, it actually calls the
-function!  You may use the B<-w> switch to find such places.
-
-=item *
-
-Symbols starting with C<_> are no longer forced into package C<main>, except
-for $_ itself (and @_, etc.).
-
-=item *
-
-C<s'$lhs'$rhs'> now does no interpolation on either side.  It used to
-interpolate C<$lhs> but not C<$rhs>.
-
-=item *
-
-The second and third arguments of splice() are now evaluated in scalar
-context (as the book says) rather than list context.
-
-=item *
-
-These are now semantic errors because of precedence:
-
-    shift @list + 20;  
-    $n = keys %map + 20; 
-
-Because if that were to work, then this couldn't:
-
-    sleep $dormancy + 20;
-
-=item *
-
-C<open FOO || die> is now incorrect.  You need parens around the filehandle.
-While temporarily supported, using such a construct will 
-generate a non-fatal (but non-suppressible) warning.
-
-=item *
-
-The elements of argument lists for formats are now evaluated in list
-context.  This means you can interpolate list values now.
-
-=item *
-
-You can't do a C<goto> into a block that is optimized away.  Darn.
-
-=item *
-
-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.
-Double darn.
-
-=item *
-
-The caller() function now returns a false value in a scalar context if there
-is no caller.  This lets library files determine if they're being required.
-
-=item *
-
-C<m//g> now attaches its state to the searched string rather than the
-regular expression.
-
-=item *
-
-C<reverse> is no longer allowed as the name of a sort subroutine.
-
-=item *
-
-B<taintperl> is no longer a separate executable.  There is now a B<-T>
-switch to turn on tainting when it isn't turned on automatically.
-
-=item *
-
-Double-quoted strings may no longer end with an unescaped C<$> or C<@>.
-
-=item *
-
-The archaic C<while/if> BLOCK BLOCK syntax is no longer supported.
-
-
-=item *
-
-Negative array subscripts now count from the end of the array.
-
-=item *
-
-The comma operator in a scalar context is now guaranteed to give a
-scalar context to its arguments.
-
 =item *
 
-The C<**> operator now binds more tightly than unary minus.  
-It was documented to work this way before, but didn't.
+If you localize an exported variable in a module, its exported value will
+not change.  The local name becomes an alias to a new value but the
+external name is still an alias for the original.
 
-=item *
-
-Setting C<$#array> lower now discards array elements.
-
-=item *
-
-delete() is not guaranteed to return the old value for tie()d arrays,
-since this capability may be onerous for some modules to implement.
-
-=item *
-
-Some error messages will be different.
-
-=item *
+=back
 
-Some bugs may have been inadvertently removed.
+As always, if any of these are ever officially declared as bugs,
+they'll be fixed and removed.
 
-=back