perl スクリプトが安全であることを確認したい場合 (または少なくとも、誤って愚かなことをしないようにしたい場合)、スクリプトに渡されたデータに対して、少なくとも何らかのチェックを行わずに、あらゆる種類の評価を行うことは避けます。しかし、とにかく何らかのチェックを行っていて、入力を明示的にチェックすることになった場合は、呼び出したいウィッチ メソッドを明示的に記述した方がよいでしょう。「既知の適切な」メソッドを使用してハッシュを設定できるため、呼び出し可能にするすべてのものを文書化し、同時に自分自身を保護できます。
my %routines = (
Module => {
Routine1 => \&Module::Method,
Routine2 => \&Module::Method2,
},
Module2 => {
# and so on
},
);
my $module = shift @ARGV;
my $routine = shift @ARGV;
if (defined $module
&& defined $routine
&& exists $routines{$module} # use `exists` to prevent
&& exists $routines{$module}{$routine}) # unnecessary autovivication
{
$routines{$module}{$routine}->(@ARGV); # with remaining command line args
}
else { } # error handling
このメソッドの優れた副作用として、あらゆる種類のヘルプ出力に使用できるメソッドを単純に繰り返すことができます。
print "Available commands:\n";
foreach my $module (keys %routines)
{
foreach my $routine (keys %$module)
{
print "$module::$routine\n";
}
}