perltrap.pod

来自「ARM上的如果你对底层感兴趣」· POD 代码 · 共 1,506 行 · 第 1/3 页

POD
1,506
字号
=head1 NAME

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>.

=head2 Awk Traps

Accustomed B<awk> users should take special note of the following:

=over 4

=item *

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<awk>; see L<perlvar> for details.

=item *

Semicolons are required after all simple statements in Perl (except
at the end of a block).  Newline is not a statement delimiter.

=item *

Curly brackets are required on C<if>s and C<while>s.

=item *

Variables begin with "$", "@" or "%" in Perl.

=item *

Arrays index from 0.  Likewise string positions in substr() and
index().

=item *

You have to decide whether your array has numeric or string indices.

=item *

Hash values do not spring into existence upon mere reference.

=item *

You have to decide whether you want to use string or numeric
comparisons.

=item *

Reading an input line does not split it for you.  You get to split it
to an array yourself.  And the split() operator has different
arguments than B<awk>'s.

=item *

The current input line is normally in $_, not $0.  It generally does
not have the newline stripped.  ($0 is the name of the program
executed.)  See L<perlvar>.

=item *

$E<lt>I<digit>E<gt> 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
the English module.

=item *

You must open your files before you print to them.

=item *

The range operator is "..", not comma.  The comma operator works as in
C.

=item *

The match operator is "=~", not "~".  ("~" is the one's complement
operator, as in C.)

=item *

The exponentiation operator is "**", not "^".  "^" is the XOR
operator, as in C.  (You know, one could get the feeling that B<awk> is
basically incompatible with C.)

=item *

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>".
And in fact, "." itself can be the beginning of a number.)

=item *

The C<next>, C<exit>, and C<continue> keywords work differently.

=item *


The following variables work differently:

      Awk	Perl
      ARGC	$#ARGV or scalar @ARGV
      ARGV[0]	$0
      FILENAME	$ARGV
      FNR	$. - something
      FS	(whatever you like)
      NF	$#Fld, or some such
      NR	$.
      OFMT	$#
      OFS	$,
      ORS	$\
      RLENGTH	length($&)
      RS	$/
      RSTART	length($`)
      SUBSEP	$;

=item *

You cannot set $RS to a pattern, only a string.

=item *

When in doubt, run the B<awk> construct through B<a2p> and see what it
gives you.

=back

=head2 C Traps

Cerebral C programmers should take note of the following:

=over 4

=item *

Curly brackets are required on C<if>'s and C<while>'s.

=item *

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.)

=item *

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 "/*".

=item *

You can't take the address of anything, although a similar operator
in Perl is the backslash, which creates a reference.

=item *

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.

=item *

Signal handlers deal with signal names, not numbers.  Use C<kill -l>
to find their names on your system.

=back

=head2 Sed Traps

Seasoned B<sed> programmers should take note of the following:

=over 4

=item *

Backreferences in substitutions use "$" rather than "\".

=item *

The pattern matching metacharacters "(", ")", and "|" do not have backslashes
in front.

=item *

The range operator is C<...>, rather than comma.

=back

=head2 Shell Traps

Sharp shell programmers should take note of the following:

=over 4

=item *

The backtick operator does variable interpolation without regard to
the presence of single quotes in the command.

=item *

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 in only certain constructs
such as double quotes, backticks, angle brackets, and search patterns.

=item *

Shells interpret scripts a little bit at a time.  Perl compiles the
entire program before executing it (except for C<BEGIN> blocks, which
execute at compile time).

=item *

The arguments are available via @ARGV, not $1, $2, etc.

=item *

The environment is not automatically made available as separate scalar
variables.

=back

=head2 Perl Traps

Practicing Perl Programmers should take note of the following:

=over 4

=item *

Remember that many operations behave differently in a list
context than they do in a scalar one.  See L<perldata> for details.

=item *

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 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>.

=item *

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.

=item *

The E<lt>FHE<gt> 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 *

Remember not to use "C<=>" when you need "C<=~>";
these two constructs are quite different:

    $x =  /foo/;
    $x =~ /foo/;

=item *

The C<do {}> construct isn't a real loop that you can use
loop control on.

=item *

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.

=item *

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.

=back

=head2 Perl4 to Perl5 Traps

Practicing Perl4 Programmers should take note of the following
Perl4-to-Perl5 specific traps.

They're crudely ordered according to the following list:

=over 4

=item Discontinuance, Deprecation, and BugFix traps

Anything that's been fixed as a perl4 bug, removed as a perl4 feature
or deprecated as a perl4 feature with the intent to encourage usage of
some other perl5 feature.

=item Parsing Traps

Traps that appear to stem from the new parser.

=item Numerical Traps

Traps having to do with numerical or mathematical operators.

=item General data type traps

Traps involving perl standard data types.

=item Context Traps - scalar, list contexts

Traps related to context within lists, scalar statements/declarations.

=item Precedence Traps

Traps related to the precedence of parsing, evaluation, and execution of
code.

=item General Regular Expression Traps using s///, etc.

Traps related to the use of pattern matching.

=item Subroutine, Signal, Sorting Traps

Traps related to the use of signals and signal handlers, general subroutines,
and sorting, along with sorting subroutines.

=item OS Traps

OS-specific traps.

=item DBM Traps

Traps specific to the use of C<dbmopen()>, and specific dbm implementations.

=item Unclassified Traps

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>.

=head2 Discontinuance, Deprecation, and BugFix traps

Anything that has been discontinued, deprecated, or fixed as
a bug from perl4.

=over 4

=item * Discontinuance

Symbols starting with "_" are no longer forced into package main, except
for C<$_> itself (and C<@_>, etc.).

    package test;
    $_legacy = 1;

    package main;
    print "\$_legacy is ",$_legacy,"\n";

    # perl4 prints: $_legacy is 1
    # perl5 prints: $_legacy is

=item * Deprecation

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.

    $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

Given that C<::> is now the preferred package delimiter, it is debatable
whether this should be classed as a bug or not.
(The older package delimiter, ' ,is used here)

    $x = 10 ;
    print "x=${'x}\n" ;

    # perl4 prints: x=10
    # perl5 prints: Can't find string terminator "'" anywhere before EOF

You can avoid this problem, and remain compatible with perl4, if you
always explicitly include the package name:

    $x = 10 ;
    print "x=${main'x}\n" ;

Also see precedence traps, for parsing C<$:>.

=item * BugFix

The second and third arguments of C<splice()> are now evaluated in scalar
context (as the Camel says) rather than list context.

    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";

    # perl4 prints: a b
    # perl5 prints: c d e

=item * Discontinuance

You can't do a C<goto> into a block that is optimized away.  Darn.

    goto marker1;

    for(1){
    marker1:
        print "Here I is!\n";
    }

    # perl4 prints: Here I is!
    # perl5 dumps core (SEGV)

=item * Discontinuance

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.

    $a = ("foo bar");
    $b = q baz ;
    print "a is $a, b is $b\n";

    # perl4 prints: a is foo bar, b is baz
    # perl5 errors: Bareword found where operator expected

=item * Discontinuance

The archaic while/if BLOCK BLOCK syntax is no longer supported.

    if { 1 } {
        print "True!";
    }
    else {
        print "False!";
    }

    # perl4 prints: True!
    # perl5 errors: syntax error at test.pl line 1, near "if {"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?