gpt4 book ai didi

perl - 如何检查 Perl 标量是否可以被视为子程序?

转载 作者:行者123 更新时间:2023-12-04 15:06:08 24 4
gpt4 key购买 nike

我有一个 API,它最初只采用一个普通的常量整数,但我正在扩展它,以便在使用时可以通过传递子例程引用来计算它。为了保持向后兼容性,我正在测试它是否是代码引用:

'CODE' eq ref($var)
? $var->()
: $var;

但我意识到这不包括充当子程序的对象。像这样的东西:
package Foo {
sub new { bless {}, 'Foo' }
use overload '&{}' => sub { sub { "Hello, world." } };
}

我可以尝试在 eval 中调用它阻止,但后来要仔细检查 $@确定它是否因为它不是子例程引用而失败(因此回退到它是一个简单的标量)与被调用的子例程因某种原因失败(应该传播错误)。

在这种情况下,当然,由于旧值是非引用,我可以假设任何引用都是可调用的,但我想要一个通用的解决方案(因为我以前使用过这种方法,它曾经是 hashref )。是否有一种简单可靠的方法来测试标量是否“可执行”?

最佳答案

您可以通过尝试取消引用它来进行检查,但不能将它作为子例程运行。

my $is_code = ref $ref && do { local $@; eval { $ref = \&$ref; 1 } };

在这种情况下,您不关心错误是什么,只关心是否发生了错误。 \&$ref就足够了,但通过将结果分配回 $ref您可以避免在调用该 coderef 时再次调用重载。本地化 $@只是为了礼貌。

my Autoload::AUTOCAN module 中所用, 最初归功于 haarg。

关于perl - 如何检查 Perl 标量是否可以被视为子程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368602/

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