如何查找数组是否包含特定引用?
如果数组不包含引用,我会做类似的事情
my %hash = map { $_ => 1 } @haystack;
say "in haystack" if exists $hash{$needle};
但是使用例如@haystack=({},{},{})
and $needle=$haystack[0]
,这会将所有这些引用和指针转换为字符串。这仍然是推荐的方法吗?
您可以将引用用作哈希键,但请记住,它们在添加到哈希之前会转换为字符串,并且您不能再次将它们用作引用。
像这样的代码工作正常。
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};
您可以用数字比较参考:
say "in haystack" if grep $_ == $needle, @haystack;
由于在这种情况下引用被转换为它们的数字地址,它们都将返回相同的数字。当然,数字或字符串有可能转换为相同的数字,因此如果您不确定您的参数是否是引用,您可能需要检查一下。例如
for (@haystack) {
next unless ref($_) eq ref($needle);
say "in haystack", last if $_ == $needle;
}