X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlsyn.pod;h=c27933015c3effbff40f675b1af8ea4065426685;hb=0111df86b68202837d8ca044a27bbc00d7895fb1;hp=a65b4cd2638b6f97231fb5905a0a047f140489d9;hpb=003183f2462c206a39eddd45957c1a29fc593c37;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod index a65b4cd..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. @@ -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 @@ -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,7 +510,7 @@ 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 environment variable.