में "Perl Best Practices" AutoLoad पर खंड में बहुत पहली पंक्ति है:मुझे पर्ल के ऑटोोलॉड का उपयोग कब करना चाहिए?
AutoLoad
हालांकि सभी मामलों में वह वर्णन करता OO या मॉड्यूल के साथ काम कर रहे हैं प्रयोग न करें।
मेरे पास एक स्टैंड स्टैंड अकेली स्क्रिप्ट है जिसमें कुछ कमांड लाइन नियंत्रण स्विच करती है जो विशेष कार्यों के संस्करण परिभाषित करती हैं। अब मुझे पता है कि मैं बस सशर्त और evals ले सकता हूं और सब कुछ से पहले मेरी फाइल के शीर्ष पर नग्न चिपका सकता हूं, लेकिन मुझे फ़ाइल के अंत में ऑटोोलॉइड में रखने के लिए सुविधाजनक और क्लीनर लगता है।
क्या यह बुरा अभ्यास/शैली है? यदि आप ऐसा सोचते हैं तो क्यों, और ऐसा करने का एक और तरीका है?
ब्रायन के अनुरोध
के अनुसार मैं मूल रूप से इस का उपयोग कर रहा कमांड लाइन स्विच के आधार पर सशर्त संकलन करने के लिए।
मुझे कुछ रचनात्मक आलोचना नहीं है।
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;
}
आप जो कर रहे हैं उसका एक उदाहरण चर्चा में सुधार करेगा। :) –