2012-03-18 139 views
1

我不是在這個非常好,也許你能幫助我嗎? 通過將鍵和值作爲數組推送,我已經成功地將一個表加載到哈希中。 (我知道我的術語可能不正確,請隨時糾正,你可以在我的代碼中看到我的意思)。無論如何,我無法打印像我想要的輸出。我的目標是以fasta格式爲每個密鑰創建一個單獨的文件(請參見下文)。有任何想法嗎?如何在Perl中打印散列(或其元素)?

輸入: 一個表:

Rank Query Name E-Value Frame Description Accession (to NCBI) Bits Fraction Identical (%) Fraction Conserved (%) HSP Length Query Length Hit Length Coverage Query (%) Coverage Hit (%) Query Start Query End Hit Start Hit End Query String 
1 50085564 4e-16 0 rank=0087540 x=1133.0 y=3620.5 length=437 GXEIR0201C1TW2 76.1 60.3174603174603 77.7777777777778 63 149 437 42.2818791946309 14.41647597254 87 149 186 372 YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALVFDVADLVKDALVLPWAFI 
2 50085564 7e-16 0 rank=0408491 x=1798.0 y=287.0 length=296 GX6ON9A01EN42P 74.8 62.7118644067797 79.6610169491525 59 149 296 39.5973154362416 19.9324324324324 91 149 51 225 NGFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALVFDVADLVKDALVLPWAFI 
3 50085564 2e-15 0 rank=0281898 x=768.0 y=1387.0 length=283 GX6ON9A01B5QL5 72.9 63.1578947368421 80.7017543859649 57 149 283 38.255033557047 20.1413427561837 93 149 51 219 FLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALVFDVADLVKDALVLPWAFI 
4 50085564 3e-15 0 rank=0714663 x=648.0 y=2458.0 length=264 GXEIR0201BU76K 72.3 59.6491228070175 80.7017543859649 57 149 264 38.255033557047 21.5909090909091 93 149 79 247 FLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALIFDVADLVKDALILPWAFI 
5 50085564 3e-14 0 rank=0643198 x=1035.0 y=163.0 length=398 GXEIR0201CS5IT 69.8 61.4035087719298 78.9473684210526 57 149 398 38.255033557047 14.321608040201 93 149 147 315 FLNHGNYLAYGLAATTLWVLGIPHGFAVMXGKTRRGALVFDVADLVKDALVLPWAFI 
6 50085564 4e-09 0 rank=0641162 x=178.0 y=3351.0 length=287 GXEIR0201APZFT 52.3 54.7619047619048 76.1904761904762 42 149 287 28.1879194630872 14.6341463414634 1 42 11 134 PIANTTVILLGNGTSITQAAVRMLAQAGVLIGFCGGGGTPLY 
7 50085564 4e-09 0 rank=0189408 x=1683.0 y=2055.0 length=418 GXEIR0201ED2ZD 52.8 45.3333333333333 68 75 149 418 50.3355704697987 17.9425837320574 1 75 64 340 PIANTTVILLGNGTSITQAAVRMLAQAGVLIGFCGGGGTPLYMGNAIEWLTPQSEYRPTEYLQGWLGFWFDDEQRLLTAKAMQHSRIDFLQKV 
8 50085564 5e-07 0 rank=0324549 x=1541.5 y=2792.5 length=281 GX6ON9A01D1MRE 45.2 75.8620689655172 89.6551724137931 29 149 281 19.4630872483221 10.3202846975089 121 149 197 281 MXGKTRRGALVFDVADLVKDALVLPWAFI 
9 50085564 6e-05 0 rank=0560234 x=126.0 y=2770.0 length=351 GXEIR0201ALEM8 38.7 42.6966292134831 59.5505617977528 89 149 351 59.7315436241611 25.3561253561254 30 124 57 345 LAGFDGDGLIPALDS---SRANID---RAMKTGDLLTSEAQLTKLLYKFAARSTT*KAL/YREHDATDKANGFLNHGNYLAYGLAATTLSG\LGIPHGFAVMHGK 

欲輸出:在單獨的文件(與它的每個accesion是在一個單獨的文件中的值,下面的例子是用於這樣的文件中的一個)

>GXEIR0201C1TW2 YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKT \ RRGALVFDVADLVKDALVLPWAFI >GXEIR0201C1TW2 NAFLNHGNYLAYGLAATTLWVLGIPHGF/AVMHGKTRRGALVFDVADLVKDALVLPWAF >GXEIR0201C1TW2 YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFA * MHGKTRRGALVFDVADLVKDALVLPWAFI`

(以下加入也一樣;我叫我的腳本$關鍵在一個單獨的文件)

我的劇本至今:

#!/usr/bin/perl -w 
my $infile=$ARGV[0] or die ("File not opening\n"); 
#### first file is a list of the reads ... you want to feed this list into a hash to pick only unique ones. 
open (LIST,$infile); 
my %value=(); #declare the hash 
my $rank; my $query; my $evalue; my $frame; my $description; my $key; my $bits; 
my$fr_ident; my $fr_cons; my $query_leng; my $hit_leng; my $query_cov; my $hit_cov; my $query_start; my $query_end; my $hit_start; my $hit_end; 
my $value;my $hsp_leng; 

while (<LIST>) 
{ 
    ($rank,$query,$evalue,$frame,$description,$key,$bits,$fr_ident,$hsp_leng,$fr_cons,$query_leng,$hit_leng,$query_cov,$hit_cov,$query_start,$query_end,$hit_start,$hit_end,$value) = split(/\t/); # split your input by a /t and enter each into a value// might not need all of these, but good for future ref 
    push (@{$value{$key}},$value);chomp (@{$value{$key}},$value); # make key and values for each entry 
} 

foreach $key (sort keys %value) 
{ 
    #print "KEY: $key , VALUE: $value , ELEMENT? \$value\{key\} : $value{$key}\n"; 
    print "$key\[email protected]{$value{$key}}\n"; #print all values of each key 
    #open (OUT, ">".$infile.$key"\_primary.fasta"); 
} 

這給了我鑰匙的一個不錯的輸出,這一切的價值觀,我想使用的密鑰一個新的文件名,我的最後一行,並有東西在下面顯示的輸出文件中...

這是48小時後嘗試,我在這個非常糟糕的,嘗試閱讀網上的東西,但我沒有很好地遵守。 在此先感謝。

回答

1

如果將數組放入字符串中,它將使用special variable$"作爲分隔符將值連接起來。所以你需要設置該變量。

$" = "\n"; 
foreach $key (sort keys %value) 
{ 
    open my $OUT, ">", $infile.$key."_primary.fasta"; 
    print $OUT "$key\[email protected]{$value{$key}}\n"; 
    close $OUT; 
} 

注意第一個參數爲print()是打印到的文件句柄。

一個等效的解決方案是使用join()功能。

foreach $key (sort keys %value) 
{ 
    open my $OUT, ">", $infile.$key."_primary.fasta"; 
    print $OUT join "\n", $key, @{$value{$key}}; 
    print $OUT "\n"; 
    close $OUT; 
} 

print()也可以取項目列表。在這種情況下,您需要將特殊變量$,設置爲您希望作爲列表值分隔符的值。否則,在列表中的值將只印有沒有分隔,因爲$,默認情況下未定義:

$, = "\n"; 
foreach my $key (sort keys %value) 
{ 
    open my $OUT, ">", $infile.$key."_primary.fasta"; 
    print $OUT $key, @{$value{$key}}; 
    print $OUT "\n"; 
    close $OUT; 
} 
+0

太感謝了......我需要的,我調整了第一部分做打印$ OUT2「> $鍵\ n「; 打印$ OUT2加入 「\ n> $鍵\ n」,@ {$值$ {鍵}}; – 2012-03-18 13:48:22

+0

恩,你的第一段是錯的。你試過了嗎?只需運行@foo =(「one」,「two」,「three」);打印「測試:@foo \ n」;'看看它打印什麼。或者,更好的是,查找'$「'在[參閱perldoc perlvar(http://perldoc.perl.org/perlvar.html)。 – 2012-03-18 16:00:23

+0

感謝你的更正 – stevenl 2012-03-19 01:23:32