gpt4 book ai didi

perl - 如何将方法修饰符应用于 AUTOLOAD 生成的方法?

转载 作者:行者123 更新时间:2023-12-04 02:46:36 27 4
gpt4 key购买 nike

我有一个非常有趣的困境。我正在开发 CVS 存储库的 Perl 脚本接口(interface),并创建了 Perl 对象来表示 Modules , Paths , 和 Files .由于Modules , Paths , 和 Files都可以对它们发出 CVS 命令,我设置了 AUTOLOAD例程采用任何未识别的方法并在对象上发出它们,就好像它们是 CVS 命令一样。

所有这些 CVS 命令都以完全相同的方式执行,但其中一些需要对输出进行特殊处理才能获得我想要的结果。

例如,我想从 diff 命令获取输出并在返回之前重新格式化它。

我正在使用 Moose ,所以通常这种特殊处理可以如下进行:

after 'diff' => sub {
# Reformat output here
}

问题是...我从未明确创建过 diff方法,因为它是由 AUTOLOAD 生成的Perl 不允许我为它创建方法修饰符,因为它在技术上不存在!

Is there a way to get this to work how I want?

最佳答案

申请 after给您的AUTOLOAD方法。

after 'AUTOLOAD' => sub {
my $method = $The::Package::AUTOLOAD;
$method =~ s/.*:://;
if ($method eq 'diff') {
# do after diff stuff
} elsif ($method eq 'foo') {
# do after foo stuff
} else {
# never mind, don't want to do anything after this function
}
};

编辑:

我发现我可能想要更多地控制 diff命令,因此我在您的答案中添加了更多详细信息。希望有人会发现这些信息有用。

要获得更多控制,您可以使用 around !
around 'AUTOLOAD' => sub {
my $orig = shift;
my $self = shift;
(my $command = $AUTOLOAD) =~ s{.+::}{};

# Special processing
if ($command eq 'diff') {

#
# Add "before" special processing here
#

my $output = $self->$orig(@_);

#
# Add "after" special processing here
#

}
else {
return $self->$orig(@_);
}
};

这允许您在调用函数之前和之后进行特殊处理。

如需更多信息,请参阅: Moose::Manual::MethodModifiers

关于perl - 如何将方法修饰符应用于 AUTOLOAD 生成的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32530936/

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