これはperlfaq4の「特定の要素がリストまたは配列に含まれているかどうかを知るにはどうすればよいですか?」に対する回答で回答されています。.
perlfaq を検索するには、お気に入りのブラウザーを使用して、 perlfaqのすべての質問のリストを検索できます。
コマンドラインから -q スイッチを使用して perldoc にキーワードを検索できます。「リスト」を検索すると、答えが見つかります。
perldoc -q list
(この回答の一部はAnno Siegelとbrian d foyによって提供されました)
「in」という言葉を聞くと、データを格納するためにリストや配列ではなくハッシュを使用する必要があったことを示しています。ハッシュは、この質問に迅速かつ効率的に答えるように設計されています。配列はそうではありません。
そうは言っても、これにアプローチするにはいくつかの方法があります。Perl 5.10 以降では、スマート マッチ演算子を使用して、項目が配列またはハッシュに含まれていることを確認できます。
use 5.010;
if( $item ~~ @array )
{
say "The array contains $item"
}
if( $item ~~ %hash )
{
say "The hash contains $item"
}
以前のバージョンの Perl では、もう少し作業を行う必要があります。このクエリを任意の文字列値に対して何度も作成する場合、おそらく最も速い方法は、元の配列を逆にして、キーが最初の配列の値であるハッシュを維持することです。
@blues = qw/azure cerulean teal turquoise lapis-lazuli/;
%is_blue = ();
for (@blues) { $is_blue{$_} = 1 }
これで、$is_blue{$some_color} かどうかを確認できます。そもそもブルースをすべてハッシュに保つのは良い考えだったかもしれません.
値がすべて小さい整数の場合は、単純なインデックス付き配列を使用できます。この種の配列は、占有するスペースが少なくなります。
@primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31);
@is_tiny_prime = ();
for (@primes) { $is_tiny_prime[$_] = 1 }
# or simply @istiny_prime[@primes] = (1) x @primes;
ここで、$is_tiny_prime[$some_number] かどうかを確認します。
問題の値が文字列ではなく整数である場合は、代わりにビット文字列を使用することでかなりのスペースを節約できます。
@articles = ( 1..10, 150..2000, 2017 );
undef $read;
for (@articles) { vec($read,$_,1) = 1 }
$n に対して vec($read,$n,1) が true かどうかを確認します。
これらのメソッドは、個々のテストの高速化を保証しますが、元のリストまたは配列を再編成する必要があります。同じ配列に対して複数の値をテストする必要がある場合にのみ効果があります。
一度だけテストする場合、標準モジュール List::Util はこの目的のために最初に関数をエクスポートします。要素が見つかったら停止することで機能します。これは速度を上げるために C で書かれており、Perl で同等のものは次のサブルーチンのようになります。
sub first (&@) {
my $code = shift;
foreach (@_) {
return $_ if &{$code}();
}
undef;
}
速度がほとんど問題にならない場合、一般的なイディオムは、スカラー コンテキストで grep を使用して (条件を通過したアイテムの数を返します)、リスト全体をトラバースします。ただし、これには、見つかった一致の数を示すという利点があります。
my $is_there = grep $_ eq $whatever, @array;
一致する要素を実際に抽出したい場合は、リスト コンテキストで grep を使用するだけです。
my @matches = grep $_ eq $whatever, @array;