gpt4 book ai didi

perl - 什么时候应该使用 Perl 的 AUTOLOAD?

转载 作者:行者123 更新时间:2023-12-04 03:24:24 26 4
gpt4 key购买 nike

在“Perl Best Practices”中,AUTOLOAD 部分的第一行是:

Don't use AUTOLOAD



然而,他描述的所有案例都在处理 OO 或模块。

我有一个独立的脚本,其中一些命令行开关控制特定函数的哪些版本被定义。现在我知道我可以只使用条件句和 eval 并将它们裸露在我的文件顶部,然后再将它们放在文件顶部,但我发现将它们放在文件末尾的 AUTOLOAD 中既方便又干净。

这是不好的做法/风格吗?如果你这么认为,为什么,还有另一种方法吗?

根据布赖恩的要求

我基本上使用它来基于命令行开关进行条件编译。

我不介意一些 build 性的批评。
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;
}

最佳答案

如果您使用 AUTOLOAD 的唯一原因就是将 block 重定位到最后,为什么不把它放在一个子程序的最后,然后在定义了它的因变量后立即调用它呢?

sub tcpdump;  # declare your subs if you want to call without parens

# define the parameters

compile();

# code that uses new subs

sub compile {
*tcpdump = $tcpdump ? sub {
my $msg = shift;
warn gf_time()." Thread ".threads->tid().": $msg\n";
} : sub {};
# ...
}
# EOF

更好的是,如果其他地方不需要全局变量,只需将值传递给 compile作为论据。

关于perl - 什么时候应该使用 Perl 的 AUTOLOAD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2460787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com