2016-03-29 32 views
1

anahtar/değer çiftlerinin bir listesini itme Ben bir anahtar/değer çiftleri listesini aşağıdaki gibi bir perl karma içine 'itmeye çalışıyorum. Bir dizi bir karma atandığında anahtar-değer çiftleri atanmış gibi çalışacağını düşündüm. @targets, her öğe için sekmeyle ayrılmış dizeler içerir. Bununla birlikte, harita döngüsünün her yinelemesi için, karma, üzerine yazılmıştır ve sonunda, @targets'un son elemanına karşılık gelen hashta yalnızca bir anahtar-değer çiftini aldım. Her zamanki gibi $ID_Gene{$key}=$value tür atamaları önlemek için çalışıyorum.Perl Hash

Bir listeyi karta anahtar-değer çifti olarak nasıl ittirirsiniz?

Alternatif Ben isimsiz karma oluşturmak ve daha sonra özgün karma bu karma zorlayabilir bir yolu var mı gibi:? %ID_Gene = (%ID_Gene, %AnonyHash); Neredeyse geldin

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

cevap

4

, sadece haksız atama var Yer, bu yüzden bir öğe eklediğinizde tüm karmayı yok etmeyi bitirdiniz. Genel bir kural olarak, map'da yan etkileri olan şeyler yapmak genellikle mantıklı değildir. Zaten %ID_Gene bazı şeyler var ve buna eklemek istiyorsanız

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

, sen

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

yapabilir ya da düşünürseniz bu çok fazla bir satırda oluyor: Sadece yapabilirsiniz :

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

İkinci ve üçüncü çözümleri sevdiğimden emin değilim. Eğer '% ID_Gene' yeterince büyükse, kendi içeriğinden yapılmış bir liste ile yeniden başlatılması biraz verimsiz olabilir. – tjd

+0

@tjd Anlaşmalı. $ Target'ımı (@targets) {my ($ k, $ v) = split/\ t /, $ target; $ ID_Gene {$ k} = $ v; Mevcut bir karma için. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot kararlaştırdı, bazen daha iyi, ama OP özellikle bu çözümü istemedi :) – hobbs