Perlでは、作成方法を教えてくださいハッシュがキーから、指定された配列?
質問
そう言っては、"配列"とか思ってたくさんの"な配列を含むX?"です。の効率的に行うことですが、その配列のハッシュのキーが配列の要素があり、そのままを言えばいいの
if($hash{X}) { ... }
やないというこの配列への変換のハッシュ?理想的で汎用性のある匿名の配列を返します匿名のハッシュ.
解決
%hash = map { $_ => 1 } @array;
などの"@ハッシュ{@配列}=..."のソリューションですが、そのものハッシュおよび配列で定義するどこか他の、あなたはここで匿名の配列を返します匿名のハッシュ.
うことなく配列内の各要素は、ペアでは"1"このリスト(キー,1,鍵,1,鍵1)ペアを取得し指のハッシュの奇数のものとなるハッシュのキーは、偶数のものとなり、それぞれの値です。
他のヒント
@hash{@array} = (1) x @array;
このハッシュ、スライスリストの値のハッシュ、女将が切り盛りしているこの店のリスト-y@にしています。
から のドキュメント:
だ戸惑いのはなぜ使用 る'@'にあるハッシュスライスの代わりに の'%'を考えましょう。の タイプのブラケット(スクエアまたは巻き) 支配的となるかどうかの配列または ハッシュを探索します。のその他の 手の記号('$'または'@') の配列、ハッシュるかどうかを示します おり、特異値 (スカラ)または複数のワン(リスト).
@hash{@keys} = undef;
の構文はこちらではのハッシュ、 @
ではのハッシュなります。していっ $hash{$keys[0]}
や $hash{$keys[1]}
や $hash{$keys[2]}
...一覧の左側は、=、lvalueたちで提供することのリストには、実際のハッシュの設定を行いる値を、指定の鍵となります。この場合のみ指定した値として、その価値が $hash{$keys[0]}
, のその他のハッシュエすべてのオートvivify(カメラ)と未定義の値です。"私の独自の提案をここで設定した表現=1,思セットの一1他 undef
.までの一貫として見るように、以下の数値なんてありません。]
達されlvalueの左側は、=、リスト内蔵のハッシュのように始めのあいだを用いること @
.[除くと思いまPerl6.]
このアイデアはご利用のハッシュセットになっています。●その価値を私に譲;だけの存在の鍵となります。そんなようなもの:
if ($hash{$key} == 1) # then key is in the hash
代わり:
if (exists $hash{$key}) # then key is in the set
これは実際より効率的に行 exists
チェックをわざわざの値のハッシュは、私にとってここで重要なことはセンターのいることを表すだけで設定のキーのハッシュ.また、誰かが指摘されることによ undef
としての価値ここでは、消費収納スペースに比し格となります。(やましたが以下、混乱としての価値を問いませんので、溶液の割に価値の最初の要素のハッシュ、その他 undef
, 一部の他のソリューションはcartwheels構築値の配列のハッシュ;完全に無駄な努力).
った場合、タイピング if ( exists $hash{ key } )
なくすひっきりなしに変わりませんので、予めごらの問題関心は本当に存在するキーではなくtruthinessの値を利用することができ、短い
@hash{@key} = ();
あぱここでは、最も効率的に行うにはたくさんの"な配列を含むX?"チェックに変換することである配列のハッシュ.効率化により少ない資源が多く、時間も空間もプログラマです。希少なくとも倍のメモリ消費をリストのハッシュ、リストの頃。プラスだ書面により独自のコードだけをテストする必要があり、文書等
代替手法として、一覧に目を通してみてくださ::MoreUtilsモジュールを具体的には、機能 any()
, none()
, true()
や false()
.彼らはすべてブロックとしての条件付きリストを表示しているので、引数として、 map()
や grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
を行った迅速試験、負荷を半分に/usr/share/dict/言葉の配列(25000わちブンイレブンの言葉から選択されるまでの全辞書(毎5000番語)の配列を使用し、両方の配列をハッシュ方法とは any()
機能一覧から::MoreUtils.
にPerl5.8.8からソースの配列をハッシュ法に走るほとんど1100xの any()
法(1300x速下にUbuntu6.06のパッケージPerl5.8.7.)
これについては収録しておりませんの話しかし、配列への変換のハッシュ関0.04秒るこの場合には殺しの時間効率の配列をハッシュ法x1.5-2倍速 any()
方法。まだ良いが、なくて、シコシコとした恒星.
私の直感は、この配列をハッシュの方法ではビート any()
ほとんどの場合、がいを感じ、よりよい場合があったのはより強固な指標に多くのテストケース、ディーセントワークの統計分析、もしかしたbig-Oアルゴリズムがそれぞれの分野で最先端の方法等) お客様の必要に応じて、リスト::MoreUtilsがより良いソリューションそれは確かに柔軟に必要符号といいます。この時期尚早の最適化はsin...:)
いつも考えること
foreach my $item (@array) { $hash{$item} = 1 }
た少なくとも何が読保守性.
Perl5.10があるマジック~~オペレーター:
sub invite_in {
my $vampires = [ qw(Angel Darla Spike Drusilla) ];
return ($_[0] ~~ $vampires) ? 0 : 1 ;
}
こちらをご参照: http://dev.perl.org/perl5/news/2007/perl-5.10.0.html
意のための完全性、普段のやり方を行うことの2つの同じ長さの配列 @keys
や @vals
好たハッシュ...
my %hash = map { $keys[$_] => $vals[$_] } (0..@keys-1);
Raldiソリューションを引き締めるこ('=>'元の必要はない):
my %hash = map { $_,1 } @array;
この技術にも使用できますの転換テキストのリストへのハッシュ:
my %hash = map { $_,1 } split(",",$line)
また持ちの場合の値のようになります:"foo=1、バー=2のときbaz=3"を実行します。
my %hash = map { split("=",$_) } split(",",$line);
[編集へ]
も提供したソリューションにかわる線):
my %hash;
#The values in %hash can only be accessed by doing exists($hash{$key})
#The assignment only works with '= undef;' and will not work properly with '= 1;'
#if you do '= 1;' only the hash key of $array[0] will be set to 1;
@hash{@array} = undef;
このまま使用 Perl6::接合.
use Perl6::Junction qw'any';
my @arr = ( 1, 2, 3 );
if( any(@arr) == 1 ){ ... }
う場合の設定論的な業務での使用 セット::スカラー または類似のモジュールです。その $s = Set::Scalar->new( @array )
こっていますので、注意しましょができるのがクエリでは: $s->contains($m)
.
できる場所は互いた汚染お名前
my $hash_ref =
sub{
my %hash;
@hash{ @{[ qw'one two three' ]} } = undef;
return \%hash;
}->();
もう:
sub keylist(@){
my %hash;
@hash{@_} = undef;
return \%hash;
}
my $hash_ref = keylist qw'one two three';
# or
my @key_list = qw'one two three';
my $hash_ref = keylist @key_list;
またパスの配列の参照
sub keylist(\@){
my %hash;
@hash{ @{$_[0]} } = undef if @_;
return \%hash;
}
my @key_list = qw'one two three';
my $hash_ref = keylist @key_list;
またチェックアウトしたいとし タイ::IxHash, を実施する注連想配列.ることができるもの種類のルックアップ(ハッシュおよび指標についてのコピーをデータです。
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @a = qw(5 8 2 5 4 8 9);
my @b = qw(7 6 5 4 3 2 1);
my $h = {};
@{$h}{@a} = @b;
print Dumper($h);
を注を繰り返しのキーの値を取得します。で最大の位置に配列-ie8->2は6)
$VAR1 = {
'8' => '2',
'4' => '3',
'9' => '1',
'2' => '5',
'5' => '4'
};