Если вы хотите убедиться, что ваш 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";
}
}