"Perl Best Practices" la primera línea en la sección sobre AUTOLOAD es:¿Cuándo debería usar AUTOLOAD de Perl? En
No utilice AUTOLOAD
Sin embargo, todos los casos que se describen están tratando con OO o módulos.
Tengo un script independiente en el que algunos modificadores de línea de comando controlan qué versiones de funciones particulares se definen. Ahora sé que podría tomar los condicionales y las evaluaciones y pegarlos desnudos en la parte superior de mi archivo antes que cualquier otra cosa, pero me parece conveniente y más limpio ponerlos en AUTOLOAD al final del archivo.
¿Es esta mala práctica/estilo? Si piensas así, ¿por qué? ¿Hay otra forma de hacerlo?
Según la petición de Brian
Soy básicamente usando esto para hacer la compilación condicional en base a parámetros de línea de comandos.
No me importa una crítica constructiva.
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 ([email protected]) {
eval q(sub grow {});
}
goto &$method;
} else {
eval "sub $method {}";
return;
}
die [email protected] if [email protected];
goto &$method;
}
Un ejemplo de lo que está haciendo mejoraría la discusión. :) –