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 + -
显示快捷键?