如何检查引用数组是否包含特定引用?

时间:2012-12-06 14:21:04

标签: perl reference

如何查找数组是否包含特定参考?

如果数组不包含引用,我会做类似

的操作
my %hash = map { $_ => 1 } @haystack;
say "in haystack" if exists $hash{$needle};

但是,例如@haystack=({},{},{})$needle=$haystack[0],这会将所有这些引用和指针转换为字符串。这仍然是推荐的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以用数字比较参考:

say "in haystack" if grep $_ == $needle, @haystack;

在此上下文中,当引用转换为其数字地址时,它们将返回相同的数字。当然有可能数字或字符串可以转换为相同的数字,因此如果您对您的参数是否为引用存在疑问,您可能需要检查它。 E.g。

for (@haystack) {
    next unless ref($_) eq ref($needle);
    say "in haystack", last if $_ == $needle;
}

答案 1 :(得分:1)

您可以将引用用作哈希键,但请记住它们在添加到哈希值之前会转换为字符串,您不能再将它们用作引用。

这样的代码工作正常。

use v5.10;
use warnings;

my %a = (a => 1);
my %b = (b => 1);
my %c = (c => 1);
my %d = (d => 1);

my @haystack = \(%a, %b, %c);

my %hash = map { $_ => 1 } @haystack;
say "in haystack" if exists $hash{\%c};