如何在perl中打印哈希(或其元素)?

时间:2012-03-18 11:58:43

标签: perl hash

我不是很擅长这个,也许你可以帮助我? 通过将键和值作为数组推送,我已成功将表加载到哈希中。 (我意识到我的术语可能不正确,请随意纠正,你可以在下面的代码中看到我的意思)。 无论如何我打印输出就像我想要的那样。我的目标是以fasta格式为每个密钥创建一个单独的文件(见下文)。任何想法?

输入: 一张桌子:

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

我想要的输出:在单独的文件中(在单独的文件中每次访问它的值,下面的示例是针对其中一个文件)

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

(以下加入相同;我在单独的文件中调用$ key中的$ key)

到目前为止我的脚本:

#!/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\n@{$value{$key}}\n"; #print all values of each key
    #open (OUT, ">".$infile.$key"\_primary.fasta");
}

这给了我一个很好的输出键和它的所有值,我想使用该键作为我的最后一行的新文件名,并在下面显示的输出中的文件内...

这是经过48小时的尝试,我真的很擅长这个,尝试阅读网上的东西,但我没有很好地遵循它。 提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您将数组放入字符串中,它将使用special variable $"作为分隔符来加入值。所以你需要设置那个变量。

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

注意print()的第一个arg是要打印到的文件句柄。

等效的解决方案是使用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;
}