X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlsyn.pod;h=aabd65d21268a984953d39cd4e796c7c259a36e7;hb=a5c75c1d181494e06a58988f267a8b3d081df483;hp=d5fe7fbb5a16f03ec1ea0b2a05d7d20d555f195f;hpb=6ec4bd10d4541458cd84a1df72dd948b519e53e9;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod index d5fe7fb..aabd65d 100644 --- a/pod/perlsyn.pod +++ b/pod/perlsyn.pod @@ -4,36 +4,40 @@ perlsyn - Perl syntax =head1 DESCRIPTION -A Perl script consists of a sequence of declarations and statements. -The sequence of statements is executed just once, unlike in B -and B scripts, where the sequence of statements is executed -for each input line. While this means that you must explicitly -loop over the lines of your input file (or files), it also means -you have much more control over which files and which lines you look at. -(Actually, I'm lying--it is possible to do an implicit loop with -either the B<-n> or B<-p> switch. It's just not the mandatory -default like it is in B and B.) - -Perl is, for the most part, a free-form language. (The only exception -to this is format declarations, for obvious reasons.) Text from a -C<"#"> character until the end of the line is a comment, and is -ignored. If you attempt to use C C-style comments, it will be -interpreted either as division or pattern matching, depending on the -context, and C++ C comments just look like a null regular -expression or defined-or operator, so don't do that. +A Perl program consists of a sequence of declarations and statements +which run from the top to the bottom. Loops, subroutines and other +control structures allow you to jump around within the code. + +Perl is a B language, you can format and indent it however +you like. Whitespace mostly serves to separate tokens, unlike +languages like Python where it is an important part of the syntax. + +Many of Perl's syntactic elements are B. Rather than +requiring you to put parentheses around every function call and +declare every variable, you can often leave such explicit elements off +and Perl will figure out what you meant. This is known as B, abbreviated B. It allows programmers to be B and to +code in a style with which they are comfortable. + +Perl B and concepts from many languages: awk, sed, C, +Bourne Shell, Smalltalk, Lisp and even English. Other +languages have borrowed syntax from Perl, particularly its regular +expression extensions. So if you have programmed in another language +you will see familiar pieces in Perl. They often work the same, but +see L for information about how they differ. =head2 Declarations -The only things you need to declare in Perl are report formats -and subroutines--and even undefined subroutines can be handled -through AUTOLOAD. A variable holds the undefined value (C) -until it has been assigned a defined value, which is anything -other than C. When used as a number, C is treated -as C<0>; when used as a string, it is treated the empty string, -C<"">; and when used as a reference that isn't being assigned -to, it is treated as an error. If you enable warnings, you'll -be notified of an uninitialized value whenever you treat C -as a string or a number. Well, usually. Boolean contexts, such as: +The only things you need to declare in Perl are report formats and +subroutines (and sometimes not even subroutines). A variable holds +the undefined value (C) until it has been assigned a defined +value, which is anything other than C. When used as a number, +C is treated as C<0>; when used as a string, it is treated as +the empty string, C<"">; and when used as a reference that isn't being +assigned to, it is treated as an error. If you enable warnings, +you'll be notified of an uninitialized value whenever you treat +C as a string or a number. Well, usually. Boolean contexts, +such as: my $a; if ($a) {} @@ -79,16 +83,30 @@ like an ordinary statement, and is elaborated within the sequence of statements as if it were an ordinary statement. That means it actually has both compile-time and run-time effects. +=head2 Comments + +Text from a C<"#"> character until the end of the line is a comment, +and is ignored. Exceptions include C<"#"> inside a string or regular +expression. + =head2 Simple Statements The only kind of simple statement is an expression evaluated for its side effects. Every simple statement must be terminated with a semicolon, unless it is the final statement in a block, in which case -the semicolon is optional. (A semicolon is still encouraged there if the -block takes up more than one line, because you may eventually add another line.) -Note that there are some operators like C and C that look -like compound statements, but aren't (they're just TERMs in an expression), -and thus need an explicit termination if used as the last item in a statement. +the semicolon is optional. (A semicolon is still encouraged if the +block takes up more than one line, because you may eventually add +another line.) Note that there are some operators like C and +C that look like compound statements, but aren't (they're just +TERMs in an expression), and thus need an explicit termination if used +as the last item in a statement. + +=head2 Truth and Falsehood + +The number 0, the strings C<'0'> and C<''>, the empty list C<()>, and +C are all false in a boolean context. All other values are true. + +=head2 Statement Modifiers Any simple statement may optionally be followed by a I modifier, just before the terminating semicolon (or block ending). The possible @@ -98,16 +116,36 @@ modifiers are: unless EXPR while EXPR until EXPR - foreach EXPR + foreach LIST + +The C following the modifier is referred to as the "condition". +Its truth or falsehood determines how the modifier will behave. + +C executes the statement once I and only if the condition is +true. C is the opposite, it executes the statement I +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 modifier is an iterator: it executes the statement once +for each item in the LIST (with C<$_> aliased to each item in turn). + + print "Hello $_!\n" foreach qw(world Dolly nurse); + +C repeats the statement I the condition is true. +C does the opposite, it repeats the statement I the +condition 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 and C modifiers have the expected semantics, -presuming you're a speaker of English. The C modifier is an -iterator: For each value in EXPR, it aliases C<$_> to the value and -executes the statement. The C and C modifiers have the -usual "C loop" semantics (conditional evaluated first), except -when applied to a C-BLOCK (or to the deprecated C-SUBROUTINE -statement), in which case the block executes once before the -conditional is evaluated. This is so that you can write loops like: +The C and C modifiers have the usual "C loop" +semantics (conditional evaluated first), except when applied to a +C-BLOCK (or to the deprecated C-SUBROUTINE statement), in +which case the block executes once before the conditional is +evaluated. This is so that you can write loops like: do { $line = ; @@ -636,13 +674,13 @@ with C). The syntax for this mechanism is the same as for most C preprocessors: it matches the regular expression # example: '# line 42 "new_filename.plx"' - /^# \s* + /^\# \s* line \s+ (\d+) \s* - (?:\s"([^"]+)")? \s* + (?:\s("?)([^"]+)\2)? \s* $/x -with C<$1> being the line number for the next line, and C<$2> being -the optional filename (specified within quotes). +with C<$1> being the line number for the next line, and C<$3> being +the optional filename (specified with or without quotes). There is a fairly obvious gotcha included with the line directive: Debuggers and profilers will only show the last source line to appear