2013-02-17 32 views
0

我是Perl的新手,必須編寫一個代碼,它將文件內容放入數組中,並打印輸出,看起來像是一個散列。下面是一個例子條目:如何打印看起來像散列的數組

my %amino_acids = (F => ["Phenylalanine", "Phe", ["TTT", "TTC"]]) 

出認沽應該正好在以上格式。文件的

行是這樣的...

"Methionine":"Met":"M":"AUG":"ATG" 
"Phenylalanine":"Phe":"F":"UUU, UUC":"TTT, TTC" 
"Proline":"Pro":"P":"CCU, CCC, CCA, CCG":"CCT, CCC, CCA, CCG" 

我不得不採取最後的密碼子分號後面,而忽略了第一組。

+0

那麼,我們是否假設冒號分隔列表中的第三個字符串是散列鍵?另外,有關所需輸出的更多細節將會有所幫助。您的「示例條目」不是有效的代碼... – 2013-02-17 07:38:33

回答

-1

Perl沒有特別的方法來打印散列。什麼你應該做的是創造讀書時,文件的散列:

while (<FILE>) { 
    my @line = split ':'; # split the line into an array 
    $amino_acids{$line[0]} = \@line[1..-1]; # take elements 1..end 
} 

,然後打印出一次哈希一個條目:

foreach (keys %amino_acids) { 
    print "$_ => [", (join ",", @$amino_acids{$_}), "]\n"; 
} 

請注意,我沒有編譯這一點,所以它可能需要少量工作才能完成。

0

假設你真的想有效Perl作爲輸出,這將做到這一點:

open(my $IN, "<input.txt") or die $!; 

while(<$IN>){ 
    chomp; 
    my @tmp = split(':',$_); 
    if(@tmp != 5){ 
     # error on this line 
     next; 
    } 
    my $group = join('","',split(/,\s*/,$tmp[4])); 
    print "\$amino_acids{$tmp[2]} = [$tmp[0],$tmp[1],[$group]];\n"; 
} 
close $IN; 

使用您的樣品線,輸出爲:

$amino_acids{"M"} = ["Methionine","Met",["ATG"]]; 
$amino_acids{"F"} = ["Phenylalanine","Phe",["TTT","TTC"]]; 
$amino_acids{"P"} = ["Proline","Pro",["CCT","CCC","CCA","CCG"]]; 
3

這是你用心打造等效哈希?還是你真的想要字符串格式?該程序使用Text::CSV從該文件構建散列,然後使用Data::Dump轉儲該散列,以便使用字符串格式。

use strict; 
use warnings; 

use Text::CSV; 
use Data::Dump 'dump'; 

my $csv = Text::CSV->new({ sep_char => ':' }); 
open my $fh, '<', 'amino.txt' or die $!; 

my %amino_acids; 
while (my $data= $csv->getline($fh)) { 
    $amino_acids{$data->[2]} = [ 
    $data->[0], 
    $data->[1], 
    [ $data->[4] =~ /[A-Z]+/g ] 
    ]; 
} 

print '$amino_acids = ', dump \%amino_acids; 

輸出

$amino_acids = { 
    F => ["Phenylalanine", "Phe", ["TTT", "TTC"]], 
    M => ["Methionine", "Met", ["ATG"]], 
    P => ["Proline", "Pro", ["CCT", "CCC", "CCA", "CCG"]], 
} 

更新

如果你真的不想安裝的模塊(這是一個非常簡單的過程,使代碼簡潔得多可靠),那麼這就是你需要的。

use strict; 
use warnings; 

open my $fh, '<', 'amino.txt' or die $!; 

print "my %amino_acids = (\n"; 

while (<$fh>) { 
    chomp; 
    my @data = /[^:"]+/g; 
    my @codons = $data[4] =~ /[A-Z]+/g; 
    printf qq{ %s => ["%s", "%s", [%s]],\n}, 
     @data[2,0,1], 
     join ', ', map qq{"$_"}, @codons; 
} 

print ")\n"; 

輸出

my %amino_acids = (
    M => ["Methionine", "Met", ["ATG"]], 
    F => ["Phenylalanine", "Phe", ["TTT", "TTC"]], 
    P => ["Proline", "Pro", ["CCT", "CCC", "CCA", "CCG"]], 
) 
0

@Borodin非常感謝您的回答,其實我沒有使用文字:: CSV或數據:: dump.I必須打開文件並從該文件構建等效散列。我試圖在不使用兩者的情況下進行操作,希望它能幫助。再次感謝!