gpt4 book ai didi

perl - 如何检测 Perl 代码是否在 eval 中运行?

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

我有 a module使用 @INC钩子(Hook)并尝试按原样安装缺少的模块use d。我不希望这种行为在 eval 内触发.我目前的尝试是:

return
if ( ( $caller[3] && $caller[3] =~ m{eval} )
|| ( $caller[1] && $caller[1] =~ m{eval} ) );

这是我在一些实验中弄乱调用堆栈的结果,但它并没有捕捉到所有东西,就像 HTTP::Tinyish 中的这段代码:
sub configure_backend {
my($self, $backend) = @_;
unless (exists $configured{$backend}) {
$configured{$backend} =
eval { require_module($backend); $backend->configure };
}
$configured{$backend};
}

sub require_module {
local $_ = shift;
s!::!/!g;
require "$_.pm";
}

也许我只需要遍历调用堆栈的每一层,直到遇到 eval或用完级别。有没有更好或更简单的方法来确定代码是否被包装在 eval 中?不遍历调用堆栈?

关于这个问题的事后分析:
  • 正如多位海报所建议的那样,这基本上是个坏主意
  • $^S从技术上讲,这是一种正确的方法,但它不会让您知道您是否在 eval 中。在堆栈中更高的位置调用
  • 使用正则表达式 + Carp::longmess()似乎是解决这个问题的最简洁的方法
  • 知道代码是否在 eval 中运行可能对提供信息有所帮助,但由于这可能由于许多不同的原因而发生,因此很难推断为什么会发生
  • 不管怎样,这是一个有趣的练习。我感谢所有贡献者的有用意见
  • 最佳答案

    Carp::longmess在一次调用中为您遍历堆栈,如果这让事情变得更容易

    return if Carp::longmess =~ m{^\s+eval }m

    关于perl - 如何检测 Perl 代码是否在 eval 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51483287/

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