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

Perl 如何检查引用数组是否包含特定引用?,perl,reference,Perl,Reference,如何查找数组是否包含特定引用 如果数组不包含引用,我会执行以下操作 my %hash = map { $_ => 1 } @haystack; say "in haystack" if exists $hash{$needle}; 但是对于例如@haystack=({},{},{},{})和$needle=$haystack[0],这会将所有这些引用和指针强制转换为字符串。这仍然是推荐的方法吗?您可以用数字比较参考: say "in haystack" if grep $_ == $ne

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

如果数组不包含引用,我会执行以下操作

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

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

您可以用数字比较参考:

say "in haystack" if grep $_ == $needle, @haystack;
当引用在此上下文中转换为数字地址时,它们都将返回相同的数字。当然,一个数字或字符串有可能转换为同一个数字,因此如果您对参数是否是引用有疑问,您可能需要检查它。例如

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

您可以将引用用作散列键,但请记住,在将它们添加到散列之前,它们会转换为字符串,并且不能再次将它们用作引用

这样的代码很好用

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};

“如果数组包含标量..”->数组只能包含标量。你是说字符串吧。您需要额外的取消引用级别。@TLP谢谢,我的意思是“如果数组包含非引用”。(除非1可能被认为是一个字符串)你可以考虑澄清你的标题。你的意思是可能引用数组包含特定的哈希键?@TLP我的意思是$pinder是一个引用,例如hash(0x1111111),我想知道该引用是否也位于仅由引用组成的
@haystack
中。签出Yes。(“这把所有的引用和指针都投射到字符串上。”)这让我怀疑这是否真的是最好的解决方案,所以我问了这个问题,看看这是否是这个问题的标准解决方案。@Andreas:这真的取决于更大的图景。可能有更好的方法,这取决于数据的性质。我不担心时间或内存使用。