“Is ~~”是一个短路运算符吗?

3

从 perlsyn 中的 详细智能匹配 部分:

智能匹配操作符尽可能地进行短路处理。

~~短路操作符 (&&, ||等) 有什么共同之处吗?

2个回答

4
是的,在一个参数是数组或哈希表时,~~ 只会检查元素直到可以确定结果。
例如,在 sub x { ... }; my %h; ...; %h ~~ \&x 中,智能匹配仅在 x 对于 %h 的所有键返回 true 时才返回 true;如果一个调用返回 false,则匹配可以立即返回 false 而不检查其余的键。这类似于 && 运算符。
另一方面,在 /foo/ ~~ %h 中,如果智能匹配找到与正则表达式匹配的一个键,则可以返回 true;这类似于 ||

4
这里的短路是指,一旦布尔结果确定,评估就会停止。
perl -E "@x=qw/a b c d/; for (qw/b w/) { say qq($_ - ), $_ ~~ @x ? q(ja) : q(nein) }"

对于输入的b,Perl不会查看在@x后面的元素。与之相反的是,grep内置函数会处理整个列表,即使只需要一个布尔值。这也是你引用的文档所提到的。请注意,保留了HTML标签。
perl -E "@x=qw/a b c/; for (qw/b d/) { say qq($_ - ), scalar grep $_, @x ? q(ja) : q(nein) }"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接