加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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不会让我为它创建方法修饰符,因为它在技术上不存在!

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

解决方法

在您的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读