X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlsyn.pod;h=ec865103c55ae71e6c6556ec94b029d0564514f8;hb=9f2f055aa1e8c86d97b5ea42473ab1747f518f3a;hp=3e78c7bd7894aec764ac880887b5a752375d6689;hpb=9f435386c83a4cc6da710aa79ee7eb835c76e1f6;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod index 3e78c7b..ec86510 100644 --- a/pod/perlsyn.pod +++ b/pod/perlsyn.pod @@ -237,7 +237,7 @@ C an C goes with. If you use C in place of C, the sense of the test is reversed. The C statement executes the block as long as the expression is -true (does not evaluate to the null string C<""> or C<0> or C<"0">). +L. The C statement executes the block as long as the expression is false. The LABEL is optional, and if present, consists of an identifier followed @@ -555,32 +555,30 @@ is exactly equivalent to when($_ ~~ $foo) -(though you need to enable the "~~" feature before you -can use the C<~~> operator directly). In fact C -is treated as an implicit smart match most of the time. The -exceptions are that when EXPR is: +In fact C is treated as an implicit smart match most of the +time. The exceptions are that when EXPR is: =over 4 -=item o +=item * a subroutine or method call -=item o +=item * a regular expression match, i.e. C or C<$foo =~ /REGEX/>, or a negated regular expression match C<$foo !~ /REGEX/>. -=item o +=item * a comparison such as C<$_ E 10> or C<$x eq "abc"> (or of course C<$_ ~~ $c>) -=item o +=item * C, C, or C -=item o +=item * A negated expression C or C, or a logical exclusive-or C<(...) xor (...)>. @@ -609,7 +607,7 @@ is applied recursively to the first argument. These rules look complicated, but usually they will do what you want. For example you could write: - when (/^\d$/ && $_ < 75) { ... } + when (/^\d+$/ && $_ < 75) { ... } Another useful shortcut is that, if you use a literal array or hash as the argument to C, it is turned into a @@ -636,7 +634,7 @@ case to the next: given($foo) { when (/x/) { say '$foo contains an x'; continue } when (/y/) { say '$foo contains a y' } - default { say '$foo contains neither an x nor a y' } + default { say '$foo does not contain a y' } } =head3 Switching in a loop @@ -676,7 +674,7 @@ order, determines the match behaviour. Any Code[+] scalar sub truth $b->($a) Hash Hash hash keys identical [sort keys %$a]~~[sort keys %$b] - Hash Array hash value slice truth grep $_, @$a{@$b} + Hash Array hash slice existence @$b == grep {exists $a->{$_}} @$b Hash Regex hash key grep grep /$b/, keys %$a Hash Any hash entry existence exists $a->{$b} @@ -698,7 +696,9 @@ order, determines the match behaviour. + - this must be a code reference whose prototype (if present) is not "" (subs with a "" prototype are dealt with by the 'Code()' entry lower down) - * - if a circular reference is found, we fall back to referential equality + * - that is, each element matches the element of same index in the other + array. If a circular reference is found, we fall back to referential + equality. ! - either a real number, or a string that looks like a number The "matching code" doesn't represent the I matching code, @@ -711,6 +711,34 @@ You can change the way that an object is matched by overloading the C<~~> operator. This trumps the usual smart match semantics. See L. +=head3 Differences from Perl 6 + +The Perl 5 smart match and C/C constructs are not +absolutely identical to their Perl 6 analogues. The most visible +difference is that, in Perl 5, parentheses are required around +the argument to C and C. Parentheses in Perl 6 +are always optional in a control construct such as C, +C, or C; they can't be made optional in Perl +5 without a great deal of potential confusion, because Perl 5 +would parse the expression + + given $foo { + ... + } + +as though the argument to C were an element of the hash +C<%foo>, interpreting the braces as hash-element syntax. + +The table of smart matches is not identical to that proposed by the +Perl 6 specification, mainly due to the differences between Perl 6's +and Perl 5's data models. + +In Perl 6, C will always do an implicit smart match +with its argument, whilst it is convenient in Perl 5 to +suppress this implicit smart match in certain situations, +as documented above. (The difference is largely because Perl 5 +does not, even internally, have a boolean type.) + =head2 Goto X