perltrap.pod

来自「MSYS在windows下模拟了一个类unix的终端」· POD 代码 · 共 1,539 行 · 第 1/3 页

POD
1,539
字号
=head1 NAMEperltrap - Perl traps for the unwary=head1 DESCRIPTIONThe 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 notmaking your entire program runnable under C<use strict>.  The third biggesttrap is not reading the list of changes in this version of Perl; seeL<perldelta>.=head2 Awk TrapsAccustomed 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$RS), as though they were in B<awk>; see L<perlvar> for details.=item *Semicolons are required after all simple statements in Perl (exceptat 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() andindex().=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 numericcomparisons.=item *Reading an input line does not split it for you.  You get to split itto an array yourself.  And the split() operator has differentarguments than B<awk>'s.=item *The current input line is normally in $_, not $0.  It generally doesnot have the newline stripped.  ($0 is the name of the programexecuted.)  See L<perlvar>.=item *$<I<digit>> does not refer to fields--it refers to substrings matchedby the last match pattern.=item *The print() statement does not add field and record separators unlessyou set C<$,> and C<$\>.  You can set $OFS and $ORS if you're usingthe 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 inC.=item *The match operator is "=~", not "~".  ("~" is the one's complementoperator, as in C.)=item *The exponentiation operator is "**", not "^".  "^" is the XORoperator, as in C.  (You know, one could get the feeling that B<awk> isbasically incompatible with C.)=item *The concatenation operator is ".", not the null string.  (Using thenull string would render C</pat/ /pat/> unparsable, because the third slashwould be interpreted as a division operator--the tokenizer is in factslightly context sensitive for operators like "/", "?", and ">".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	scalar @ARGV (compare with $#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 itgives you.=back=head2 C TrapsCerebral 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 inPerl 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 *Comments begin with "#", not "/*".=item *You can't take the address of anything, although a similar operatorin 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 forsuccess, not 0. (system(), however, returns zero for success.)=item *Signal handlers deal with signal names, not numbers.  Use C<kill -l>to find their names on your system.=back=head2 Sed TrapsSeasoned 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 backslashesin front.=item *The range operator is C<...>, rather than comma.=back=head2 Shell TrapsSharp shell programmers should take note of the following:=over 4=item *The backtick operator does variable interpolation without regard tothe 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 eachcommand line.  Perl does substitution in only certain constructssuch as double quotes, backticks, angle brackets, and search patterns.=item *Shells interpret scripts a little bit at a time.  Perl compiles theentire program before executing it (except for C<BEGIN> blocks, whichexecute at compile time).=item *The arguments are available via @ARGV, not $1, $2, etc.=item *The environment is not automatically made available as separate scalarvariables.=back=head2 Perl TrapsPracticing Perl Programmers should take note of the following:=over 4=item *Remember that many operations behave differently in a listcontext 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 isa function or a string.  By using quotes on strings andparentheses on function calls, you won't ever get them confused.=item *You cannot discern from mere inspection which builtinsare unary operators (like chop() and chdir())and which are list operators (like print() and unlink()).(Unless prototyped, user-defined subroutines can B<only> be listoperators, never unary ones.)  See L<perlop> and L<perlsub>.=item *People have a hard time remembering that some functionsdefault to $_, or @ARGV, or whatever, but that others whichyou might expect to do not.=item *The <FH> construct is not the name of the filehandle, it is a readlineoperation on that handle.  The data read is assigned to $_ only if thefile 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 useloop control on.=item *Use C<my()> for local variables whenever you can get away withit (but see L<perlform> for where you can't).Using C<local()> actually gives a local value to a globalvariable, which leaves you open to unforeseen side-effectsof dynamic scoping.=item *If you localize an exported variable in a module, its exported value willnot change.  The local name becomes an alias to a new value but theexternal name is still an alias for the original.=back=head2 Perl4 to Perl5 TrapsPracticing Perl4 Programmers should take note of the followingPerl4-to-Perl5 specific traps.They're crudely ordered according to the following list:=over 4=item Discontinuance, Deprecation, and BugFix trapsAnything that's been fixed as a perl4 bug, removed as a perl4 featureor deprecated as a perl4 feature with the intent to encourage usage ofsome other perl5 feature.=item Parsing TrapsTraps that appear to stem from the new parser.=item Numerical TrapsTraps having to do with numerical or mathematical operators.=item General data type trapsTraps involving perl standard data types.=item Context Traps - scalar, list contextsTraps related to context within lists, scalar statements/declarations.=item Precedence TrapsTraps related to the precedence of parsing, evaluation, and execution ofcode.=item General Regular Expression Traps using s///, etc.Traps related to the use of pattern matching.=item Subroutine, Signal, Sorting TrapsTraps related to the use of signals and signal handlers, general subroutines,and sorting, along with sorting subroutines.=item OS TrapsOS-specific traps.=item DBM TrapsTraps specific to the use of C<dbmopen()>, and specific dbm implementations.=item Unclassified TrapsEverything else.=backIf you find an example of a conversion trap that is not listed here,please submit it to <F<perlbug@perl.org>> for inclusion.Also note that at least some of these can be caught with theC<use warnings> pragma or the B<-w> switch.=head2 Discontinuance, Deprecation, and BugFix trapsAnything that has been discontinued, deprecated, or fixed asa bug from perl4.=over 4=item * DiscontinuanceSymbols starting with "_" are no longer forced into package main, exceptfor 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 * DeprecationDouble-colon is now a valid package separator in a variable name.  Thus thesebehave 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: 3Given that C<::> is now the preferred package delimiter, it is debatablewhether 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 EOFYou can avoid this problem, and remain compatible with perl4, if youalways explicitly include the package name:    $x = 10 ;    print "x=${main'x}\n" ;Also see precedence traps, for parsing C<$:>.=item * BugFixThe second and third arguments of C<splice()> are now evaluated in scalarcontext (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 * DiscontinuanceYou 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 errors: Can't "goto" into the middle of a foreach loop=item * DiscontinuanceIt is no longer syntactically legal to use whitespace as the nameof 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 * DiscontinuanceThe 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 {"=item * BugFixThe C<**> operator now binds more tightly than unary minus.It was documented to work this way before, but didn't.    print -4**2,"\n";    # perl4 prints: 16    # perl5 prints: -16=item * DiscontinuanceThe meaning of C<foreach{}> has changed slightly when it is iterating over alist which is not an array.  This used to assign the list to a

⌨️ 快捷键说明

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