В " Perl Best Practices " самая первая строка в разделе об автозагрузке:
Не использовать AUTOLOAD
Однако все описанные им случаи имеют дело с ОО или Модулями.
У меня есть автономный скрипт, в котором некоторые ключи командной строки управляют определением версий определенных функций. Теперь я знаю, что могу просто взять условные выражения и уловки и прикрепить их голыми в верхней части моего файла, прежде чем что-либо еще, но я считаю, что удобнее и чище помещать их в AUTOLOAD в конце файла.
Это плохая практика / стиль? Если вы так думаете, почему, и есть ли другой способ сделать это?
По запросу Брайана
Я в основном использую это для условной компиляции на основе ключей командной строки.
Я не против конструктивной критики.
sub AUTOLOAD {
our $AUTOLOAD;
(my $method = $AUTOLOAD) =~ s/.*:://s; # remove package name
if ($method eq 'tcpdump' && $tcpdump) {
eval q(
sub tcpdump {
my $msg = shift;
warn gf_time()." Thread ".threads->tid().": $msg\n";
}
);
} elsif ($method eq 'loginfo' && $debug) {
eval q(
sub loginfo {
my $msg = shift;
$msg =~ s/$CRLF/\n/g;
print gf_time()." Thread ".threads->tid().": $msg\n";
}
);
} elsif ($method eq 'build_get') {
if ($pipelining) {
eval q(
sub build_get {
my $url = shift;
my $base = shift;
$url = "http://".$url unless $url =~ /^http/;
return "GET $url HTTP/1.1${CRLF}Host: $base$CRLF$CRLF";
}
);
} else {
eval q(
sub build_get {
my $url = shift;
my $base = shift;
$url = "http://".$url unless $url =~ /^http/;
return "GET $url HTTP/1.1${CRLF}Host: $base${CRLF}Connection: close$CRLF$CRLF";
}
);
}
} elsif ($method eq 'grow') {
eval q{ require Convert::Scalar qw(grow); };
if ($@) {
eval q( sub grow {} );
}
goto &$method;
} else {
eval "sub $method {}";
return;
}
die $@ if $@;
goto &$method;
}