Trong "Perl Best Practices" dòng đầu tiên trong phần trên Autoload là:Khi nào tôi nên sử dụng AUTOLOAD của Perl?
Không sử dụng Autoload
Tuy nhiên tất cả các trường hợp ông mô tả đang đối phó với OO hoặc Modules.
Tôi có một tập lệnh độc lập trong đó một số công tắc dòng lệnh kiểm soát phiên bản của các chức năng cụ thể được xác định. Bây giờ tôi biết tôi chỉ có thể lấy các điều kiện và evals và dính chúng trần truồng ở trên cùng của tập tin của tôi trước khi mọi thứ khác, nhưng tôi thấy nó thuận tiện và sạch hơn để đặt chúng trong AUTOLOAD ở phần cuối của tập tin.
Thực tiễn/phong cách này có tệ không? Nếu bạn nghĩ vậy tại sao, và có cách nào khác để làm điều đó không?
Theo yêu cầu của brian của
Tôi đang sử dụng về cơ bản này để làm biên soạn có điều kiện dựa trên công tắc dòng lệnh.
Tôi không quan tâm đến một số lời chỉ trích mang tính xây dựng.
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;
}
Ví dụ về những gì bạn đang làm sẽ cải thiện cuộc thảo luận. :) –