我有很多遗留了很多代码的遗留代码,我想做的是添加一个require或最少的代码更改以使反引号做一些不同的事情,例如打印而不是运行代码

我尝试使用use subs,但我无法接管反引号或qx(我重新定义了系统,这是少担心的一件事)

我也试着做一个包装:

package thingmbob;
use Data::Dumper;
use overload    '``'    => sub { CORE::print "things!:\t", Dumper \@_};
#this works for some reason
$thingmbob::{'(``'}('ls');
#this does the standard backtick operation
`ls`

不幸的是,我没有OOP perl的经验,而我的google-fu技能使我感到失望,有人可以向我指出正确的方向吗?

警告:
我在一个封闭的系统中,预先安装了一些cpan模块,很可能我没有预装任何高级模块,而且我绝对无法获得新的

我在perl5.14上

编辑:

为了完整起见,我想添加我的(主要是)最终产品
BEGIN {
    *CORE::GLOBAL::readpipe = sub {
        print Dumper(\@_);
        @internal = readpipe(@_);
        if(wantarray){
            return @internal;
        }else{
            return join('',@internal);
        }
    };
}

我希望它打印将要运行的内容,然后再运行它。 wantarray很重要,因为没有它,标量上下文将无法工作

最佳答案

这个perlmonks article解释了如何做。您可以覆盖内置的 readpipe



您需要将其放入BEGIN块中,因此最好不要使用require,而应使用use使其尽可能早地可用。

使用 CORE::GLOBAL:: namespace覆盖内置函数。

BEGIN {
    *CORE::GLOBAL::readpipe = sub {
        print "@_";
    }
}

print qx/ls/;
print `ls`;

输出:
ls1ls1

其中ls@_,而1是覆盖子内的print的返回值。

另外,还有ex::override,它在引擎盖下执行相同的操作,但内部内容较少怪异。

关于perl - 重新定义反引号或使其重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42670099/

10-11 08:17