X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlsyn.pod;h=c27933015c3effbff40f675b1af8ea4065426685;hb=0111df86b68202837d8ca044a27bbc00d7895fb1;hp=484af52121f5e24be177ef5f60fea2157dab39ed;hpb=9f1b1f2d9ab55954ee07a14c4ab04bd3dd1f99d5;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod index 484af52..c279330 100644 --- a/pod/perlsyn.pod +++ b/pod/perlsyn.pod @@ -33,9 +33,19 @@ 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 ("don't-care") -contexts and operators such as C<++>, C<-->, C<+=>, C<-=>, and -C<.=> are always exempt from such warnings. +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 than +definedness). 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 on the execution of the primary sequence of statements--declarations all @@ -53,8 +63,8 @@ subroutine without defining it by saying C, thus: sub myname; $me = myname $0 or die "can't get myname"; -Note that my() functions as a list operator, not as a unary operator; so -be careful to use C instead of C<||> in this case. However, if +Note that myname() functions as a list operator, not as a unary operator; +so be careful to use C instead of C<||> in this case. However, if you were to declare the subroutine as C, then C would function as a unary operator, so either C or C<||> would work. @@ -172,7 +182,7 @@ If the LABEL is omitted, the loop control statement refers to the innermost enclosing loop. This may include dynamically looking back your call-stack at run time to find the LABEL. Such desperate behavior triggers a warning if you use the C -praga or the B<-w> flag. +pragma or the B<-w> flag. Unlike a C statement, a C statement never implicitly localises any variables. @@ -230,9 +240,10 @@ which is Perl short-hand for the more explicitly written version: # now process $line } -Note that if there were a C block on the above code, it would get -executed even on discarded lines. This is often used to reset line counters -or C one-time matches. +Note that if there were a C block on the above code, it would +get executed only on lines discarded by the regex (since redo skips the +continue block). A continue block is often used to reset line counters +or C one-time matches: # inspired by :1,$g/fred/s//WILMA/ while (<>) { @@ -253,17 +264,20 @@ The loop control statements don't work in an C or C, since they aren't loops. You can double the braces to make them such, though. if (/pattern/) {{ - next if /fred/; - next if /barney/; - # so something here + 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 that +executes once, see L<"Basic BLOCKs and Switch Statements">. + The form C, available in Perl 4, is no longer available. Replace any occurrence of C by C. =head2 For Loops -Perl's C-style C loop works exactly like the corresponding C loop; +Perl's C-style C loop works like the corresponding C loop; that means that this: for ($i = 1; $i < 10; $i++) { @@ -279,8 +293,10 @@ is the same as this: $i++; } -(There is one minor difference: The first form implies a lexical scope -for variables declared with C in the initialization expression.) +There is one minor difference: if variables are declared with C +in the initialization section of the C, the lexical scope of +those variables is exactly the C loop (the body of the loop +and the control sections). Besides the normal array index looping, C can lend itself to many other interesting applications. Here's one that avoids the @@ -309,9 +325,12 @@ The C keyword is actually a synonym for the C keyword, so you can use C for readability or C for brevity. (Or because the Bourne shell is more familiar to you than I, so writing C comes more naturally.) If VAR is omitted, C<$_> is set to each value. -If any element of LIST is an lvalue, you can modify it by modifying VAR -inside the loop. That's because the C loop index variable is -an implicit alias for each item in the list that you're looping over. + +If any element of LIST is an lvalue, you can modify it by modifying +VAR inside the loop. Conversely, if any element of LIST is NOT an +lvalue, any attempt to modify that element will fail. In other words, +the C loop index variable is an implicit alias for each item +in the list that you're looping over. If any part of LIST is an array, C will get very confused if you add or remove elements within the loop body, for example with @@ -324,7 +343,7 @@ Examples: for (@ary) { s/foo/bar/ } - foreach my $elem (@elements) { + for my $elem (@elements) { $elem *= 2; } @@ -353,8 +372,8 @@ Here's how a C programmer might code up a particular algorithm in Perl: Whereas here's how a Perl programmer more comfortable with the idiom might do it: - OUTER: foreach my $wid (@ary1) { - INNER: foreach my $jet (@ary2) { + OUTER: for my $wid (@ary1) { + INNER: for my $jet (@ary2) { next OUTER if $wid > $jet; $wid += $jet; } @@ -388,8 +407,18 @@ structures. } There is no official C statement in Perl, because there are -already several ways to write the equivalent. In addition to the -above, you could write +already several ways to write the equivalent. + +However, starting from Perl 5.8 to get switch and case one can use +the Switch extension and say: + + use Switch; + +after which one has switch and case. It is not as fast as it could be +because it's not really part of the language (it's done using source +filters) but it is available, and it's very flexible. + +In addition to the above BLOCK construct, you could write SWITCH: { $abc = 1, last SWITCH if /^abc/; @@ -481,9 +510,9 @@ Or "read-only"; }; -Or if you are certainly that all the C<&&> clauses are true, you can use +Or if you are certain that all the C<&&> clauses are true, you can use something like this, which "switches" on the value of the -C envariable. +C environment variable. #!/usr/bin/perl # pick out jargon file page based on browser @@ -525,7 +554,7 @@ The C-EXPR form expects a label name, whose scope will be resolved dynamically. This allows for computed Cs per FORTRAN, but isn't necessarily recommended if you're optimizing for maintainability: - goto ("FOO", "BAR", "GLARCH")[$i]; + goto(("FOO", "BAR", "GLARCH")[$i]); The C-&NAME form is highly magical, and substitutes a call to the named subroutine for the currently running subroutine. This is used by @@ -598,6 +627,11 @@ C with C<$1> being the line number for the next line, and C<$2> being the optional filename (specified within quotes). +There is a fairly obvious gotcha included with the line directive: +Debuggers and profilers will only show the last source line to appear +at a particular line number in a given file. Care should be taken not +to cause line number collisions in code you'd like to debug later. + Here are some examples that you should be able to type into your command shell: