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

ここでライブ活動中

==参照がorをオーバーロードする何かに恵まれている場合、それは壊れます0+(これは coderefs ではありそうにありません)。その場合、比較しScalar::Util::refaddr($selected)ます。

からman perlref:

参照を数値として使用すると、メモリ内の格納場所を表す整数が生成されます。これを行う唯一の有用な方法は、2 つの参照を数値的に比較して、それらが同じ場所を参照しているかどうかを確認することです。

      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 に答える