如何查找数组是否包含特定参考?
如果数组不包含引用,我会做类似
的操作my %hash = map { $_ => 1 } @haystack;
say "in haystack" if exists $hash{$needle};
但是,例如@haystack=({},{},{})
和$needle=$haystack[0]
,这会将所有这些引用和指针转换为字符串。这仍然是推荐的方法吗?
答案 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};