perlsyn.pod

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· POD 代码 · 共 878 行 · 第 1/2 页

POD
878
字号
=head1 NAMEX<syntax>perlsyn - Perl syntax=head1 DESCRIPTIONA Perl program consists of a sequence of declarations and statementswhich run from the top to the bottom.  Loops, subroutines and othercontrol structures allow you to jump around within the code.Perl is a B<free-form> language, you can format and indent it howeveryou like.  Whitespace mostly serves to separate tokens, unlikelanguages like Python where it is an important part of the syntax.Many of Perl's syntactic elements are B<optional>.  Rather thanrequiring you to put parentheses around every function call anddeclare every variable, you can often leave such explicit elements offand Perl will figure out what you meant.  This is known as B<Do What IMean>, abbreviated B<DWIM>.  It allows programmers to be B<lazy> and tocode in a style with which they are comfortable.Perl B<borrows syntax> and concepts from many languages: awk, sed, C,Bourne Shell, Smalltalk, Lisp and even English.  Otherlanguages have borrowed syntax from Perl, particularly its regularexpression extensions.  So if you have programmed in another languageyou will see familiar pieces in Perl.  They often work the same, butsee L<perltrap> for information about how they differ.=head2 DeclarationsX<declaration> X<undef> X<undefined> X<uninitialized>The only things you need to declare in Perl are report formats andsubroutines (and sometimes not even subroutines).  A variable holdsthe undefined value (C<undef>) until it has been assigned a definedvalue, which is anything other than C<undef>.  When used as a number,C<undef> is treated as C<0>; when used as a string, it is treated asthe empty string, C<"">; and when used as a reference that isn't beingassigned to, it is treated as an error.  If you enable warnings,you'll be notified of an uninitialized value whenever you treatC<undef> as a string or a number.  Well, usually.  Boolean contexts,such as:    my $a;    if ($a) {}are exempt from warnings (because they care about truth rather thandefinedness).  Operators such as C<++>, C<-->, C<+=>,C<-=>, and C<.=>, that operate on undefined left values such as:    my $a;    $a++;are also always exempt from such warnings.A declaration can be put anywhere a statement can, but has no effect onthe execution of the primary sequence of statements--declarations alltake effect at compile time.  Typically all the declarations are put atthe beginning or the end of the script.  However, if you're usinglexically-scoped private variables created with C<my()>, you'llhave to make sureyour format or subroutine definition is within the same block scopeas the my if you expect to be able to access those private variables.Declaring a subroutine allows a subroutine name to be used as if it were alist operator from that point forward in the program.  You can declare asubroutine without defining it by saying C<sub name>, thus:X<subroutine, declaration>    sub myname;    $me = myname $0 		or die "can't get myname";Note that myname() functions as a list operator, not as a unary operator;so be careful to use C<or> instead of C<||> in this case.  However, ifyou were to declare the subroutine as C<sub myname ($)>, thenC<myname> would function as a unary operator, so either C<or> orC<||> would work.Subroutines declarations can also be loaded up with the C<require> statementor both loaded and imported into your namespace with a C<use> statement.See L<perlmod> for details on this.A statement sequence may contain declarations of lexically-scopedvariables, but apart from declaring a variable name, the declaration actslike an ordinary statement, and is elaborated within the sequence ofstatements as if it were an ordinary statement.  That means it actuallyhas both compile-time and run-time effects.=head2 CommentsX<comment> X<#>Text from a C<"#"> character until the end of the line is a comment,and is ignored.  Exceptions include C<"#"> inside a string or regularexpression.=head2 Simple StatementsX<statement> X<semicolon> X<expression> X<;>The only kind of simple statement is an expression evaluated for itsside effects.  Every simple statement must be terminated with asemicolon, unless it is the final statement in a block, in which casethe semicolon is optional.  (A semicolon is still encouraged if theblock takes up more than one line, because you may eventually addanother line.)  Note that there are some operators like C<eval {}> andC<do {}> that look like compound statements, but aren't (they're justTERMs in an expression), and thus need an explicit termination if usedas the last item in a statement.=head2 Truth and FalsehoodX<truth> X<falsehood> X<true> X<false> X<!> X<not> X<negation> X<0>The number 0, the strings C<'0'> and C<''>, the empty list C<()>, andC<undef> are all false in a boolean context. All other values are true.Negation of a true value by C<!> or C<not> returns a special false value.When evaluated as a string it is treated as C<''>, but as a number, itis treated as 0.=head2 Statement ModifiersX<statement modifier> X<modifier> X<if> X<unless> X<while>X<until> X<foreach> X<for>Any simple statement may optionally be followed by a I<SINGLE> modifier,just before the terminating semicolon (or block ending).  The possiblemodifiers are:    if EXPR    unless EXPR    while EXPR    until EXPR    foreach LISTThe C<EXPR> following the modifier is referred to as the "condition".Its truth or falsehood determines how the modifier will behave.C<if> executes the statement once I<if> and only if the condition istrue.  C<unless> is the opposite, it executes the statement I<unless>the condition is true (i.e., if the condition is false).    print "Basset hounds got long ears" if length $ear >= 10;    go_outside() and play() unless $is_raining;The C<foreach> modifier is an iterator: it executes the statement oncefor each item in the LIST (with C<$_> aliased to each item in turn).    print "Hello $_!\n" foreach qw(world Dolly nurse);C<while> repeats the statement I<while> the condition is true.C<until> does the opposite, it repeats the statement I<until> thecondition is true (or while the condition is false):    # Both of these count from 0 to 10.    print $i++ while $i <= 10;    print $j++ until $j >  10;The C<while> and C<until> modifiers have the usual "C<while> loop"semantics (conditional evaluated first), except when applied to aC<do>-BLOCK (or to the deprecated C<do>-SUBROUTINE statement), inwhich case the block executes once before the conditional isevaluated.  This is so that you can write loops like:    do {	$line = <STDIN>;	...    } until $line  eq ".\n";See L<perlfunc/do>.  Note also that the loop control statements describedlater will I<NOT> work in this construct, because modifiers don't takeloop labels.  Sorry.  You can always put another block inside of it(for C<next>) or around it (for C<last>) to do that sort of thing.For C<next>, just double the braces:X<next> X<last> X<redo>    do {{	next if $x == $y;	# do something here    }} until $x++ > $z;For C<last>, you have to be more elaborate:X<last>    LOOP: { 	    do {		last if $x = $y**2;		# do something here	    } while $x++ <= $z;    }B<NOTE:> The behaviour of a C<my> statement modified with a statementmodifier conditional or loop construct (e.g. C<my $x if ...>) isB<undefined>.  The value of the C<my> variable may be C<undef>, anypreviously assigned value, or possibly anything else.  Don't rely onit.  Future versions of perl might do something different from theversion of perl you try it out on.  Here be dragons.X<my>=head2 Compound StatementsX<statement, compound> X<block> X<bracket, curly> X<curly bracket> X<brace>X<{> X<}> X<if> X<unless> X<while> X<until> X<foreach> X<for> X<continue>In Perl, a sequence of statements that defines a scope is called a block.Sometimes a block is delimited by the file containing it (in the caseof a required file, or the program as a whole), and sometimes a blockis delimited by the extent of a string (in the case of an eval).But generally, a block is delimited by curly brackets, also known as braces.We will call this syntactic construct a BLOCK.The following compound statements may be used to control flow:    if (EXPR) BLOCK    if (EXPR) BLOCK else BLOCK    if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK    LABEL while (EXPR) BLOCK    LABEL while (EXPR) BLOCK continue BLOCK    LABEL until (EXPR) BLOCK    LABEL until (EXPR) BLOCK continue BLOCK    LABEL for (EXPR; EXPR; EXPR) BLOCK    LABEL foreach VAR (LIST) BLOCK    LABEL foreach VAR (LIST) BLOCK continue BLOCK    LABEL BLOCK continue BLOCKNote that, unlike C and Pascal, these are defined in terms of BLOCKs,not statements.  This means that the curly brackets are I<required>--nodangling statements allowed.  If you want to write conditionals withoutcurly brackets there are several other ways to do it.  The followingall do the same thing:    if (!open(FOO)) { die "Can't open $FOO: $!"; }    die "Can't open $FOO: $!" unless open(FOO);    open(FOO) or die "Can't open $FOO: $!";	# FOO or bust!    open(FOO) ? 'hi mom' : die "Can't open $FOO: $!";			# a bit exotic, that last oneThe C<if> statement is straightforward.  Because BLOCKs are alwaysbounded by curly brackets, there is never any ambiguity about whichC<if> an C<else> goes with.  If you use C<unless> in place of C<if>,the sense of the test is reversed.The C<while> statement executes the block as long as the expression isL<true|/"Truth and Falsehood">.The C<until> statement executes the block as long as the expression isfalse.The LABEL is optional, and if present, consists of an identifier followedby a colon.  The LABEL identifies the loop for the loop controlstatements C<next>, C<last>, and C<redo>.If the LABEL is omitted, the loop control statementrefers to the innermost enclosing loop.  This may include dynamicallylooking back your call-stack at run time to find the LABEL.  Suchdesperate behavior triggers a warning if you use the C<use warnings>pragma or the B<-w> flag.If there is a C<continue> BLOCK, it is always executed just before theconditional is about to be evaluated again.  Thus it can be used toincrement a loop variable, even when the loop has been continued viathe C<next> statement.=head2 Loop ControlX<loop control> X<loop, control> X<next> X<last> X<redo> X<continue>The C<next> command starts the next iteration of the loop:    LINE: while (<STDIN>) {	next LINE if /^#/;	# discard comments	...    }The C<last> command immediately exits the loop in question.  TheC<continue> block, if any, is not executed:    LINE: while (<STDIN>) {	last LINE if /^$/;	# exit when done with header	...    }The C<redo> command restarts the loop block without evaluating theconditional again.  The C<continue> block, if any, is I<not> executed.This command is normally used by programs that want to lie to themselvesabout what was just input.For example, when processing a file like F</etc/termcap>.If your input lines might end in backslashes to indicate continuation, youwant to skip ahead and get the next record.    while (<>) {	chomp;	if (s/\\$//) {	    $_ .= <>;	    redo unless eof();	}	# now process $_    }which is Perl short-hand for the more explicitly written version:    LINE: while (defined($line = <ARGV>)) {	chomp($line);	if ($line =~ s/\\$//) {	    $line .= <ARGV>;	    redo LINE unless eof(); # not eof(ARGV)!	}	# now process $line    }Note that if there were a C<continue> block on the above code, it wouldget executed only on lines discarded by the regex (since redo skips thecontinue block). A continue block is often used to reset line countersor C<?pat?> one-time matches:    # inspired by :1,$g/fred/s//WILMA/    while (<>) {	?(fred)?    && s//WILMA $1 WILMA/;	?(barney)?  && s//BETTY $1 BETTY/;	?(homer)?   && s//MARGE $1 MARGE/;    } continue {	print "$ARGV $.: $_";	close ARGV  if eof();		# reset $.	reset	    if eof();		# reset ?pat?    }If the word C<while> is replaced by the word C<until>, the sense of thetest is reversed, but the conditional is still tested before the firstiteration.The loop control statements don't work in an C<if> or C<unless>, sincethey aren't loops.  You can double the braces to make them such, though.    if (/pattern/) {{	last if /fred/;	next if /barney/; # same effect as "last", but doesn't document as well	# do something here    }}This is caused by the fact that a block by itself acts as a loop thatexecutes once, see L<"Basic BLOCKs">.The form C<while/if BLOCK BLOCK>, available in Perl 4, is no longeravailable.   Replace any occurrence of C<if BLOCK> by C<if (do BLOCK)>.=head2 For LoopsX<for> X<foreach>Perl's C-style C<for> loop works like the corresponding C<while> loop;that means that this:    for ($i = 1; $i < 10; $i++) {	...    }is the same as this:    $i = 1;    while ($i < 10) {	...    } continue {	$i++;    }There is one minor difference: if variables are declared with C<my>in the initialization section of the C<for>, the lexical scope ofthose variables is exactly the C<for> loop (the body of the loopand the control sections).X<my>Besides the normal array index looping, C<for> can lend itselfto many other interesting applications.  Here's one that avoids theproblem you get into if you explicitly test for end-of-file onan interactive file descriptor causing your program to appear tohang.X<eof> X<end-of-file> X<end of file>    $on_a_tty = -t STDIN && -t STDOUT;    sub prompt { print "yes? " if $on_a_tty }    for ( prompt(); <STDIN>; prompt() ) {	# do something    }Using C<readline> (or the operator form, C<< <EXPR> >>) as theconditional of a C<for> loop is shorthand for the following.  Thisbehaviour is the same as a C<while> loop conditional.X<readline> X<< <> >>    for ( prompt(); defined( $_ = <STDIN> ); prompt() ) {        # do something    }=head2 Foreach LoopsX<for> X<foreach>The C<foreach> loop iterates over a normal list value and sets thevariable VAR to be each element of the list in turn.  If the variableis preceded with the keyword C<my>, then it is lexically scoped, andis therefore visible only within the loop.  Otherwise, the variable isimplicitly local to the loop and regains its former value upon exitingthe loop.  If the variable was previously declared with C<my>, it usesthat variable instead of the global one, but it's still localized tothe loop.  This implicit localisation occurs I<only> in a C<foreach>loop.X<my> X<local>The C<foreach> keyword is actually a synonym for the C<for> keyword, soyou can use C<foreach> for readability or C<for> for brevity.  (Or becausethe Bourne shell is more familiar to you than I<csh>, so writing C<for>comes more naturally.)  If VAR is omitted, C<$_> is set to each value.X<$_>If any element of LIST is an lvalue, you can modify it by modifyingVAR inside the loop.  Conversely, if any element of LIST is NOT anlvalue, any attempt to modify that element will fail.  In other words,the C<foreach> loop index variable is an implicit alias for each itemin the list that you're looping over.X<alias>If any part of LIST is an array, C<foreach> will get very confused ifyou add or remove elements within the loop body, for example withC<splice>.   So don't do that.X<splice>C<foreach> probably won't do what you expect if VAR is a tied or otherspecial variable.   Don't do that either.Examples:    for (@ary) { s/foo/bar/ }    for my $elem (@elements) {	$elem *= 2;    }    for $count (10,9,8,7,6,5,4,3,2,1,'BOOM') {	print $count, "\n"; sleep(1);    }    for (1..15) { print "Merry Christmas\n"; }    foreach $item (split(/:[\\\n:]*/, $ENV{TERMCAP})) {	print "Item: $item\n";    }Here's how a C programmer might code up a particular algorithm in Perl:

⌨️ 快捷键说明

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