perl – 如何将方法修饰符应用于AUTOLOAD生成的方法?
发布时间:2020-12-16 06:16:00 所属栏目:大数据 来源:网络整理
导读:我有一个非常有趣的困境.我正在开发一个到CVS存储库的Perl脚本接口,并创建了Perl Objects来表示模块,路径和文件.由于模块,路径和文件都可以在它们上面发出CVS命令,因此我设置AUTOLOAD例程以获取任何未识别的方法并在对象上发出它们,就像它们是CVS命令一样.
我有一个非常有趣的困境.我正在开发一个到CVS存储库的Perl脚本接口,并创建了Perl Objects来表示模块,路径和文件.由于模块,路径和文件都可以在它们上面发出CVS命令,因此我设置AUTOLOAD例程以获取任何未识别的方法并在对象上发出它们,就像它们是CVS命令一样.
所有这些CVS命令都以完全相同的方式执行,但是其中一些命令需要对输出进行特殊处理以获得我想要的结果. 例如,我想从diff命令获取输出并在返回之前重新格式化它. 我正在使用Moose,所以通常这种特殊处理可以按如下方式进行: after 'diff' => sub { # Reformat output here } 问题是……我从未明确创建diff方法,因为它是由AUTOLOAD生成的,Perl不会让我为它创建方法修饰符,因为它在技术上不存在!
解决方法
在您的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 '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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |