某所でひじょーに細かいミスを見つけたのだけど、そっちで指摘するのもアレなのでここでメモ。曰く、
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講座でした。
コメント