gpt4 book ai didi

perl - 在实用程序子例程中包装 Perl "die"和 "warn"

转载 作者:行者123 更新时间:2023-12-03 07:45:17 25 4
gpt4 key购买 nike

我想编写一个小子程序,它可以以一致的方式装饰所有错误消息,而不必在我的程序周围复制它。

但是,我希望行号来自调用它的位置,而不是来自 die 的位置。/warn发生了。

在 C 语言中,我只会使用预处理器宏,但 Perl 没有这些。实现这一点的最佳方法是什么?

最佳答案

使用Carp警告/错误。您可以使用 __WARN____DIE__影响什么的钩子(Hook)warn打印到 STDERR流以及如何 die被抛出。请注意,它们完全不同。

use warnings;
use strict;
use feature 'say';

use Carp;

$SIG{__WARN__} = \&wrap_warn;

sub wrap_warn {
print "WARNING: @_";
}

sub level_2 {
say "Print from level_2";
carp "carp from level_2(@_)";
}

sub level_1 {
level_2(@_);
}

level_1("from main");

打印到 STDOUT
Print from level_2
WARNING: carp from level_2(from main) at wrap_warn.pl line 19.
main::level_2('from main') called at wrap_warn.pl line 15
main::level_1('from main') called at wrap_warn.pl line 22

如果您还想继续访问 STDERR然后使用 print STDERR "WARNING: @_";
请务必仔细阅读 %SIG in perlvarwarn , 至少。

虽然您似乎希望这是全局性的,但我想提一下,人们通常希望 local -ize 像这样的变化。 this post 中有一个例子,还有更多。

关于perl - 在实用程序子例程中包装 Perl "die"和 "warn",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44011182/

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