2012-10-11 133 views
0

我是Perl新手,並且有關使用散列的問題。雖然之前發佈過類似的問題,但沒有一個與我的問題有關。將字符串添加到散列值的末尾

我有一個fasta文件,其中包含多個不同長度的序列,並且希望在每個fasta條目的末尾添加一個字符串(本例中爲N),直到所有序列的長度相同。此時,我可以讀取fasta文件,並將每個序列作爲字符串返回(但也可以作爲數組完成)爲散列值。關鍵元素是fasta文件的相應標題。

我的代碼如下:

###### calculate the length of each hash value and store the highest value in $max 
my $length; 
my $max = 0; 
my $addN = "N"; 

foreach $name (keys %seq) { 
    $length = length($seq{$name}); 
    if ($max < $length) { 
     $max = $length; 
    } else { next } 
    print $max,"\n"; 

    while (length ($seq{$name}) < $max) { 
     $seq{$name} .= $addN; 
    } 
    foreach $name (keys %seq) { 
     print $seq{$name}; 
     print "\n"; 
    } 
} 

這裏的問題是,這個代碼的輸出是完全一樣的輸入,例如,

INPUT: 
>fasta1 
AAAAAAAAA 
>fasta2 
AA 
OUTPUT 
>fasta1 
AAAAAAAAA 
>fasta2 
AA 

,我想等相關的輸出這個:

>fasta1 
AAAAAAAAA 
>fasta2 
AANNNNNNN 

你能幫我完成這個任務嗎?

+0

您的代碼在重新格式化後顯得很明顯。發佈之前是否做過簡化,導致嵌套錯誤? – Mat

+0

對於我來說,如何讀取樣本輸入並不明顯 - 假定它以某種方式進入%seq散列?如果你能解釋,可能會有所幫助。 –

回答

2
use 5.014; 
my %seq = (fasta1 => 'AAA', 
      fasta2 => 'AAAAAA', 
      fasta3 => 'AAAAAAAAA', 
     ); 

my $length = length((sort { length($a) < length($b) } values %seq)[0]); 
for my $name (keys %seq) { 
    $seq{$name} = $seq{$name} . ('N' x ($length - length($seq{$name}))); 
} 

while (my($name, $val) = each %seq) { 
    say "$name: $val"; 
} 

fasta2: AAAAAANNN 
fasta3: AAAAAAAAA 
fasta1: AAANNNNNN 
+0

你好社區,非常感謝Oesor和Sebastian,你的代碼對我來說都很好。現在我可以繼續前進!乾杯 – PedroA

1

您的示例代碼是錯誤的。但是,這聽起來像你有一種方法來填充基於「fasta」文件的地圖。假設這是真的,我認爲下面的代碼可以解決你的問題。

# Populate %seq from fasta file 
%seq = (               
    "fasta1"=> "AAAAAAAAA",          
    "fasta2" => "AAAA",           
    "fasta3" => "AA"            
);                

my $FILL = "N";             
my $normalized_length = 0;          

# If the normalized length = longest value      
while(my ($k,$v) = each %seq) {         
    my $len = length($v);           
    $normalized_length = $len if $len > $normalized_length;  
}                 

while(my ($k,$v) = each %seq) {         
    print $v, $FILL x ($normalized_length - length($v)), "\n"; 
} 

輸出

AAAANNNNN 
AANNNNNNN 
AAAAAAAAA 

如果需要正常化以固定的長度,那麼就設置$ normalized_length該值並跳過第一個while循環。

+0

你好社區,非常感謝Oesor和Sebastian,你的代碼對我來說工作得很好。現在我可以繼續前進!乾杯 – PedroA

相關問題