Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Perl标量是否包含对某个子例程的引用?_Perl - Fatal编程技术网

如何检查Perl标量是否包含对某个子例程的引用?

如何检查Perl标量是否包含对某个子例程的引用?,perl,Perl,换句话说,我如何检查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 => \&

换句话说,我如何检查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" ;
您可以使用普通(数字)相等(
==
),所有引用都是这样:

Perl> $selected == \&foo


Perl> $selected == \&bar


Perl> $selected == \&baz
1

当引用有重载
==
0+
的内容时(这对于coderefs来说不太可能),这会中断。在这种情况下,您需要比较
Scalar::Util::refaddr($selected)

发件人:

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

      if ($ref1 == $ref2) {  # cheap numeric compare of references
           print "refs 1 and 2 refer to the same thing\n";
       }

请注意,即使调用了相同的底层代码,这也将区分相同闭包的多个实例:
for my$a(1..2){push@x,sub{print$a}}$x[0]()$x[1]();打印$x[0]=$x[1]“
@jpalecek:perldoc参考资料做得很好。谢谢