2016-03-29 7 views
1

Ich versuche, eine Liste der Schlüssel/Wert-Paare in einen Perl-Hash wie folgt zu "schieben". Ich dachte, es würde funktionieren, wie die Schlüssel-Wert-Paare zugewiesen werden, wenn ein Array einem Hash zugewiesen wird. @targets enthält Tab-getrennte Strings für jedes Element. Jedoch wird der Hash für jede Iteration der Map-Schleife überschrieben und am Schluss habe ich nur ein Schlüssel-Wert-Paar im Hash erhalten, das dem letzten Element der @targets entspricht. Ich versuche die üblichen $ID_Gene{$key}=$value Typzuweisungen zu vermeiden.Pushing eine Liste der Schlüssel/Wert-Paare in Perl Hash

Wie pushen Sie eine Liste als Schlüssel-Wert-Paar zum Hash?

Alternativ ist es eine Möglichkeit, einen anonymen Hash bauen kann und schieben dann das Hash mit dem ursprünglichen Hash wie: %ID_Gene = (%ID_Gene, %AnonyHash);

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

Antwort

4

Sie sind fast da, man muss nur die Zuordnung in der falschen platzieren, so dass Sie jedes Mal den gesamten Hash wegblasen, wenn Sie einen Eintrag hinzufügen. In der Regel macht es keinen Sinn, Dinge mit Nebenwirkungen in map zu machen. Sie können einfach tun:

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

, wenn Sie bereits ein paar Sachen in %ID_Gene haben und Sie möchten, um es hinzuzufügen, können Sie

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

tun oder wenn Sie zu das ist denke viel in einer Zeile los :

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

ich bin nicht sicher, ich die 2. und 3. Lösungen lieben. Wenn '% ID_Gene' groß genug ist, ist eine Neuinitialisierung mit einer Liste, die aus eigenen Inhalten besteht, möglicherweise ineffizient. – tjd

+0

@tjd Einverstanden. Ich bevorzuge 'foreach my $ target (@targets) {mein ($ k, $ v) = split/\ t /, $ target; $ ID_Gene {$ k} = $ v; } 'für einen vorhandenen Hash. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot vereinbart, manchmal ist das besser, aber OP speziell nach nicht diese Lösung gefragt :) – hobbs