0

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

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

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

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

4

2 回答 2

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};
于 2012-12-06T14:36:46.097 回答
1

您可以用数字比较参考:

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

由于在这种情况下引用被转换为它们的数字地址,它们都将返回相同的数字。当然,数字或字符串有可能转换为相同的数字,因此如果您不确定您的参数是否是引用,您可能需要检查一下。例如

for (@haystack) {
    next unless ref($_) eq ref($needle);
    say "in haystack", last if $_ == $needle;
}
于 2012-12-06T14:26:55.227 回答