perlsynのスマートマッチングの詳細セクションから:
スマートマッチオペレータは、可能な限り短絡します。
短絡演算子(、、など)~~
との共通点はありますか?&&
||
はい、引数の1つが配列またはハッシュである場合~~
、結果が確実になるまで要素のみをチェックするという意味で。
たとえば、sub x { ... }; my %h; ...; %h ~~ \&x
では、スマート マッチは のx
すべてのキーに対して true を返す場合にのみ true を返します%h
。1 つの呼び出しが false を返す場合、残りのキーをチェックせずに、一致がすぐに false を返す可能性があります。これは&&
演算子に似ています。
一方、 では/foo/ ~~ %h
、正規表現に一致するキーが 1 つだけ見つかった場合、スマート マッチは true を返すことができます。これは に似てい||
ます。
ここでの短絡の意味は、ブール値の結果が確立されるとすぐに評価が停止することです。
perl -E "@x=qw/a b c d/; for (qw/b w/) { say qq($_ - ), $_ ~~ @x ? q(ja) : q(nein) }"
入力の場合、Perl はin にb
続く要素を調べません。一方、引用するドキュメントが参照するビルトインは、必要なのはブール値だけかもしれませんが、リスト全体を処理します。b
@x
grep
perl -E "@x=qw/a b c/; for (qw/b d/) { say qq($_ - ), scalar grep $_, @x ? q(ja) : q(nein) }"