gpt4 book ai didi

perl - 重新定义或重载反引号

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

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

EXPR is executed as a system command. The collected standard output of the command is returned. In scalar context, it comes back as a single (potentially multi-line) string. In list context, returns a list of lines (however you've defined lines with $/ (or $INPUT_RECORD_SEPARATOR in English)). This is the internal function implementing the qx/EXPR/ operator, but you can use it directly. The qx/EXPR/ operator is discussed in more detail in I/O Operators in perlop. If EXPR is omitted, uses $_ .



您需要将其放入 BEGIN block ,所以不 require 是有意义的, 但是 use而是尽可能早地使其可用。

使用 CORE::GLOBAL:: namespace 覆盖内置函数.
BEGIN {
*CORE::GLOBAL::readpipe = sub {
print "@_";
}
}

print qx/ls/;
print `ls`;

这输出:
ls1ls1
ls@_1print 的返回值在被覆盖的子里面。

或者,有 ex::override ,它在引擎盖下做同样的事情,但内部结构不那么奇怪。

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

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