从perlsyn的智能匹配详细部分:
智能匹配运算符尽可能短路。
与短路运算符(,等)~~
有什么共同点吗?&&
||
这里短路的意思是一旦布尔结果建立,评估就会停止。
perl -E "@x=qw/a b c d/; for (qw/b w/) { say qq($_ - ), $_ ~~ @x ? q(ja) : q(nein) }"
对于输入b
,Perl 不会查看后面的b
元素@x
。grep
另一方面,您引用的文档所引用的内置函数将处理整个列表,即使所需的所有内容可能都是布尔值。
perl -E "@x=qw/a b c/; for (qw/b d/) { say qq($_ - ), scalar grep $_, @x ? q(ja) : q(nein) }"
是的,从某种意义上说,当参数之一是数组或哈希时,~~
只会检查元素,直到可以确定结果为止。
例如,在 中,只有当 ;的所有键都返回 true时sub x { ... }; my %h; ...; %h ~~ \&x
,智能匹配才会返回 true 。如果一个调用返回 false,则匹配可以立即返回 false,而无需检查其余键。这类似于运算符。x
%h
&&
另一方面,在 中/foo/ ~~ %h
,如果智能匹配只找到一个与正则表达式匹配的键,则它可以返回 true;这类似于||
.