我有很多遗留了很多代码的遗留代码,我想做的是添加一个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/