换句话说,我该如何检查coderef的“相等性”?

smartmatch运算符不起作用for obvious reasons(将其视为CODE->(ANY)),但是我将其包含在示例中以显示我要执行的操作:

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

sub pick_at_random {

    my %table = @_;
    return ( values %table )[ rand( keys %table ) ];
}

my %lookup = ( A => \&foo,
               B => \&bar,
               C => \&baz );

my $selected = pick_at_random( %lookup );

say $selected ~~ \&foo ? "Got 'foo'" :
    $selected ~~ \&bar ? "Got 'bar'" :
    $selected ~~ \&baz ? "Got 'baz'" :
                         "Got nadda" ;

最佳答案

您可以使用普通的(数字)等式(==),就像所有引用一样:

Perl> $selected == \&foo


Perl> $selected == \&bar


Perl> $selected == \&baz
1

Live in action here

当引用被重载了==0+的东西(对于代码引用来说不太可能)时,这种情况就中断了。在这种情况下,您将比较Scalar::Util::refaddr($selected)

man perlref :

关于perl - 如何检查Perl标量是否包含对某个子例程的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13333336/

10-13 09:20
查看更多