Если вы хотите, чтобы ваш скрипт 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";
}
}
Честно говоря, есть, вероятно, лучший способ решить вашу проблему, чем передавать имя модуля и работать как текст. На самом деле, возможно, есть много способов. Может быть, если мы увидим аргументы в пользу этого проектного решения, может возникнуть лучшее решение. – 2008-10-17 08:46:25