gpt4 book ai didi

perl - 从 Perl 中的 carp 模块覆盖 croak cluck confess carp

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

我知道如何覆盖 perl 中的内置函数,我已经覆盖了 die warn say 并且自从printprintf 无法覆盖我已将其绑定(bind)到我的日志记录框架的句柄。

覆盖 warn 的示例:

BEGIN{ *CORE::GLOBAL::warn = sub {
my ($package, $filename, $line, $subroutine) = caller;
untie *STDERR;
my $message;
foreach my $arg (@_) {
$message = $message.$arg;
}
print STDERR $message;
tie *STDERR, __PACKAGE__, (*STDERR);
logmessage("warn",$message,$filename, $line);
return;
}
}

现在有什么方法可以覆盖 Perlcarp 模块的 croak cluck confess carp 吗?

最佳答案

Carp 提供的函数只是常规函数,在模块使用d 时通过 Exporter 导入到您的包中。诀窍是在任何人导入它们之前,尽早在Carp 命名空间内覆盖它们。然后当他们这样做时,他们会得到被覆盖的。

在您的脚本中,或在您自己的日志记录模块的最顶部:

BEGIN {
require Carp;

# save original croak (will create closure ...)
my $original_croak = \&Carp::croak;

no warnings 'redefine';
*Carp::croak = sub {
print "Croaking...\n"
or $original_croak->("cannot fake croak"); # (... here)
};
}

您需要加载 Carp 一次,以便 Perl 解析代码并将函数安装在 Carp 命名空间中。然后你可以覆盖它们。

稍后,在您代码的其他模块中:

use Carp 'croak';

croak 'foo';

这将产生我们上面设置的输出。

如果您想在新的Carp::croak 中调用原始的Carp::croak,请将其保存到coderef 并保留它,如上例所示。

请注意,这仅在替换发生得非常早时才有效。如果你把它放在你自己的日志记录模块中,并且它在 Carp 加载后加载,这将失败。

package Foo;
use Carp;
use Your::Logging::Framework;

croak 'foo';

将不起作用,因为在您覆盖 Carp::croak 的位置,Foo::croak 已经是原始 Carp::的副本嘎嘎声

如果你想让它工作,你总是可以将你自己的 carpcroak 等显式地导入调用者。这将在 strict 下引发一堆警告或提示,但它应该有效。

关于perl - 从 Perl 中的 carp 模块覆盖 croak cluck confess carp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46643191/

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