In "Perl 最佳实践“ 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;
}
另一种策略是将脚本编写为 App::* 模块,并让命令行选项选择要加载的类以提供可根据选项插入的任何功能。你会require
一旦你知道是哪一门课,就可以及时上学。这是更多的前期工作,但如果您打算长期维护脚本,我敢打赌它会得到回报。在过去的几年里,出现了一些非常好的工具,用于创建其功能真正存在于模块中的脚本,包括App::Cmd, MooseX::Getopt, and 两者的私生子.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)