【问题标题】:Overriding croak cluck confess carp from carp module in Perl覆盖 Perl 中 carp 模块的 croak cluck 承认 carp
【发布时间】:2018-03-20 11:18:02
【问题描述】:

我知道如何覆盖 perl 中的内置函数,并且我已经覆盖了 die warn say 并且由于 printprintf 不能被覆盖,我已经将它绑定到一个句柄我的日志框架。

覆盖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;
        }
}

现在有没有办法我可以从Perl 中的carp 模块覆盖croak cluck confess carp

【问题讨论】:

    标签: perl die overriding carp


    【解决方案1】:

    Carp 提供的函数只是常规函数,当模块为 used 时,它们会通过 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::croak 的副本。

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

    【讨论】:

    • 谢谢,因为我正在设置 env{PERL5OPT}= "-MMyLoggingModule" 我应该工作。我还有一个问题,我可以在覆盖的呱呱声中调用实际的呱呱声吗?
    • @DineshGowda 我想我已经解决了这个问题。好像我没有。您需要保存原始文件,例如成一个变量。我会编辑。
    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2011-12-19
    • 2016-03-07
    • 2010-12-07
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多