某所でひじょーに細かいミスを見つけたのだけど、そっちで指摘するのもアレなのでここでメモ。曰く、




require Module import Module qw(foo bar) if $condition;



eval "use Module qw(foo bar)" if $condition

と比べるとevalを使用する方法は$conditionが正になるまでエラーが検出できないのに対してrequire...の方はコンパイル時にスペルミス等を検出できるため、良いと思う



というコメント。俺も使うとしたら最初のほうに近い構文を使うのだけど、スペルミスの検出・・・?それは違うな。まず、コンパイル時に何かチェックが通ると言うのがおかしい。


例えば下記ソースでBEGIN {}ブロックはコンパイル時に実行されるので、BEGIN{}ブロックより前にrequire文の間違いが検出されればいいのだが、実際はそうならない:



use strict;
requir POSIX; # should be "require"
BEGIN { print "Compilation done\n" }

Perlにおけるベアワード(この場合、POSIX)まわりの処理は変数を使っている時と明らかに違うので注意。これが



use strict;
my $module = "POSIX";
eval "require $modul"; # should be $module
BEGIN { print "Compilation done\n" }

だったら確かに$moduleのスペルミスは検出してくれるんだけどね。というわけでミニPerl講座でした。