の回答は"How can I tell whether a certain element is contained in a list or array?"です。
perlfaqを検索するには、perlfaqのすべての質問のリストから、お気に入りのブラウザを使用して検索できます。
コマンドラインから、perldocに-qスイッチを使用してキーワードを検索することができます。あなたは、「リスト」を検索することで、あなたの答えを見つけているだろう:
perldoc -q list
は
公聴会「の」ワード(安野シーゲルとブライアンd foyによって寄贈されましたこの答えの部分)が表示されますリストや配列ではなく、ハッシュを使用してデータを格納しているはずです。ハッシュは、この質問にすばやく効率的に答えるように設計されています。配列はありません。
これは、これにはいくつかの方法があります。 5.10以降では、あなたはアイテムが配列やハッシュに格納されていることを確認するために、スマートマッチ演算子を使用することができますPerlの以前のバージョンでは
use 5.010;
if($item ~~ @array)
{
say "The array contains $item"
}
if($item ~~ %hash)
{
say "The hash contains $item"
}
、あなたは少しより多くの仕事をしなければなりません。今、あなたは$かどうかを確認することができ
@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 }
今VECは($、$ nは、1を読んで)であるかどうかを確認一部の$ nでは真です。
これらのメソッドは、迅速な個別テストを保証しますが、元のリストまたは配列の再編成を必要とします。同じ配列に対して複数の値をテストする必要がある場合にのみ効果があります。
標準モジュール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;
を実装して、不必要な依存関係が気に入らない場合:: Utilの。これはPerlの標準であり、qw/first /(Draegtunのように)を使用すると、1つのサブルーチンしかインポートできません。 – Telemachus
それ自体は問題ではなく、もっと個人的な好みです。 – MaxVT
List :: Utilの回答に依存する問題はありません。それが私だったら、それは受け入れられる答えだろう。コアモジュールを使用することの不毛は、私を迷信に惑わされます。この場合、grep {}はほぼ同じくらい良いです。 – singingfish