0

配列に特定の参照が含まれているかどうかを確認するにはどうすればよいですか?

配列に参照が含まれていない場合は、次のようにします

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

しかし、eg@haystack=({},{},{})$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 に答える