Perl で Yoda 条件を回避する必要があります


2000 年代半ばに、Perl でいわゆる “Yoda conditions” を主張していた短い時期を覚えています. equality comparisons の左側に定数を配置します. = の代わりに == を誤って 1 つ入力してしまった場合、コンパイラは assigning 変数ではなくそれをキャッチします.例えば.:

if ( $foo == 42 ) { ... } # don’t do this
if ( 42 == $foo ) { ... } # do this
if ( $foo = 42  ) { ... } # to prevent this


また、 a foolish consistency is the hobgoblin of little minds であるため、これを文字列およびリレーショナル比較に拡張することもできます.

if ( 'bar' eq $foo ) { ... } # weirdo
if ( 42 > $foo )     { ... } # make it stop


奇妙に見えますが、コードの前に use warnings; を付ければ不要であることがわかります. Perl は warn you : “Found = in conditional, should be == “. (補足: slated to enable warnings by default という厳格さに加えて、2022 年半ばに予定されている Perl v5.36 は、use v5.35; 以上を実行すると was enabled with use v5.11; になります.

これと他の多くの警告を致命的にキャッチしたい場合は、次のようにコードで strictures module from CPAN を使用します.

use strictures 2;


これにより、コードが exception の多くの間違いを犯した場合、コードは categories をスローします.バージョン管理システムの作業ディレクトリ (具体的には GitSubversionMercurial 、または Bazaar ) で実行している場合、モジュールは indirect object syntaxPerl 4‑style multidimensional arrays 、および bareword filehandles の使用も防ぎます.

代入と条件の話に戻ると、if ステートメント内で代入を使用することが許容される場合が 1 つあります.その場合、条件内でチェックの結果を使用する必要があります.例えば:

if ( my $foo = some_truthy_function() ) {
    ... # do something further with $foo
}


これにより、some_truthy_function() の結果のスコープがブロック内に保持されるため、外側のスコープが一時変数で汚染されることはありません.幸いなことに、Perl はこの構文について警告しません.


カバー画像: Paul VanDerWerf from Brunswick, Maine, USACC BY 2.0 、ウィキメディア・コモンズ経由