2016-03-29 14 views
1

私は以下のように、キーと値のペアのリストをperlハッシュに 'push'しようとしています。配列がハッシュに割り当てられたときにキーと値のペアが割り当てられるように動作すると思いました。 @targetsには、各要素のタブ区切り文字列が含まれています。しかし、マップループの繰り返しごとに、ハッシュが上書きされ、最後には@targetsの最後の要素に対応するハッシュ内に1つのキーと値のペアがあります。私は通常の$ID_Gene{$key}=$value型の割り当てを避けようとしています。Perlハッシュのキーと値のペアのリストをプッシュする

リストをキー値ペアとしてハッシュにプッシュするにはどうすればよいですか?

また、私は無名ハッシュを構築し、元のハッシュにそのハッシュをプッシュすることができますどのような方法がありますように:?%ID_Gene = (%ID_Gene, %AnonyHash);あなたはほとんどそこにいる

my %ID_Gene; 
map{ %ID_Gene= (split /\t/,$_) ; 
}@targets; 

答えて

4

、あなただけの間違ったで割り当てを持っていますあなたがアイテムを追加するたびにハッシュ全体を吹き飛ばすことになります。一般的には、副作用のあるものは通常mapには意味がありません。あなたは、単に行うことができます。

my %ID_Gene = map { split /\t/, $_ } @targets; 

すでに%ID_Geneにいくつかのものがあり、それに追加したい場合は、あなたが

%ID_Gene = (%ID_Gene, map { split /\t/, $_ } @targets); 

かを行うことができますが、それはあまりにも1行で起こっていると思われる場合:

my %to_add = map { split /\t/, $_ } @targets; 
%ID_Gene = (%ID_Gene, %to_add); 
+1

私は2番目と3番目の解決策が大好きです。 '%ID_Gene'が十分大きければ、それ自身の内容で作られたリストを使ってそれを再初期化することは非効率的かもしれません。 – tjd

+0

@tjd合意。私は '私の$ target(@targets){my($ k、$ v)= split/\ t /、$ target; $ ID_Gene {$ k} = $ v; } '既存のハッシュのために。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackいいえ、時にはそれは良いですが、OPは具体的にその解決策を求めていません:) – hobbs

関連する問題