如何检测是否在eval中运行Perl代码?
发布时间:2020-12-15 21:59:25 所属栏目:大数据 来源:网络整理
导读:我有 a module使用@INC钩子并试图安装丢失的模块,因为它们被使用.我不希望这种行为在eval内部触发.我目前的尝试是: return if ( ( $caller[3] $caller[3] =~ m{eval} ) || ( $caller[1] $caller[1] =~ m{eval} ) ); 这是我在一些实验中乱用调用堆栈的结果,
我有
a module使用@INC钩子并试图安装丢失的模块,因为它们被使用.我不希望这种行为在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中? 在这个问题上验尸: >正如多张海报所暗示的那样,这基本上是一个坏主意 解决方法
如果这样可以让事情变得更容易,Carp :: longmess会在一次调用中遍历堆栈
return if Carp::longmess =~ m{^s+eval }m (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |