8

换句话说,我如何检查 coderef “平等”?

smartmatch 运算符由于明显的原因不起作用(将其视为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" ;
4

1 回答 1

11

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

Perl> $selected == \&foo


Perl> $selected == \&bar


Perl> $selected == \&baz
1

在这里生活

当引用受到重载==0+(对于coderefs不太可能)的祝福时,就会中断。在这种情况下,你会比较Scalar::Util::refaddr($selected).

来自man perlref

将引用用作数字会生成一个整数,表示其在内存中的存储位置。唯一有用的事情是在数字上比较两个引用以查看它们是否引用相同的位置。

      if ($ref1 == $ref2) {  # cheap numeric compare of references
           print "refs 1 and 2 refer to the same thing\n";
       }
于 2012-11-11T17:07:41.473 回答