gpt4 book ai didi

perl - 如何确定是否正在使用 caller 在 eval 内部调用子例程?

转载 作者:行者123 更新时间:2023-12-04 18:07:56 25 4
gpt4 key购买 nike

我还在学习 Perl,我的任务是使用 caller确定是否正在从 eval 调用子例程在任何更高的级别。我应该想出一些代码来测试并打印 Yes如果它来自 evalNo如果不是。我找不到任何关于如何使用 caller 的好例子在网上,想知道是否有人对如何去做这件事有任何想法或建议。

最佳答案

你不应该为此使用调用者。引用 perlvar :

$EXCEPTIONS_BEING_CAUGHT
$^S
Current state of the interpreter.

$^S State
--------- -------------------------------------
undef Parsing module, eval, or main program
true (1) Executing an eval
false (0) Otherwise

The first state may happen in $SIG{__DIE__} and $SIG{__WARN__} handlers.
The English name $EXCEPTIONS_BEING_CAUGHT is slightly misleading, because the
undef value does not indicate whether exceptions are being caught, since
compilation of the main program does not catch exceptions.

This variable was added in Perl 5.004.

至于为什么:
C:\Users\user>perl -MBenchmark -E "timethese(20000000, {'caller' => sub {caller()}, '$^S' => sub {$^S}})"
Benchmark: timing 20000000 iterations of $^S, caller...
$^S: 0 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) @ 183486238.53/s (n=20000000)
(warning: too few iterations for a reliable count)
caller: 1 wallclock secs ( 0.87 usr + 0.00 sys = 0.87 CPU) @ 22909507.45/s (n=20000000)

这是在我们甚至通过在调用堆栈上进行多次迭代并针对堆栈级别运行字符串函数来使调用者代码陷入困境之前,假设我们将为所有边缘情况编写无错误的代码等。

编写代码以使用调用者来确定这是一个核心功能的完整重新实现。这就像问,“我如何使用标量来实现链表?”答案应该是“使用数组”,而不是“这就是方法!”

关于perl - 如何确定是否正在使用 caller 在 eval 内部调用子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183010/

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