2013-02-17 60 views
-4

我得到下面的輸出的輸出:我想格式化我的Perl

"I"=> ["Isoleucine","Ile",["ATT,ATC,ATA"]]; 
"L"=> ["Leucine","Leu",["TTA,TTG,CTT,CTC,CTA,CTG"]]; 
"K"=> ["Lysine","Lys",["AAA,AAG"]]; 

當我使用的代碼

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

我怎樣才能擺脫我的左右鍵雙引號?

+1

是什麼輸入什麼樣子的? – chepner 2013-02-17 18:41:35

+0

從你自己的回答到你的[上一個問題](http://stackoverflow.com/questions/1491893)(它應該是一個評論),你說你不想使用'Text :: CSV'。我不知道這是爲什麼?安裝模塊非常簡單。 – Borodin 2013-02-17 19:25:16

回答

1

雙引號似乎是其各自字符串的一部分。這表明您的解析可能會被破壞。作爲代碼示例給出的循環也沒有多大意義(重新定義循環內部循環的變量,即使該變量應該是無害的,也是不好的樣式)。

看來你想

my @genetic_codes = /(?:\A|(?<=:)) "([^"]*)" (?=:|\z)/xg; # not tested 
...; 
沿着這些線路

my @genetic_codes = split /:/; 
s/^"//, s/"$// for @genetic_codes; 
...; 

什麼的。

第一種可能性是用/g和列表上下文用大致相同的正則表達式替換split

第二種解決方案可能是優選的,並從在@genetic_codes所有元素的所有前導和尾隨空格。這種解決方案可能更靈活並且不易出錯。

提示:如果不分裂的/加入,你可以只是做

(my $group = $genetic_codes[4]) =~ s/(?<=,)\s+//g; # remove whitespace after every comma 
2

我會忘記split,並使用正則表達式來查找不在一個冒號或報價的所有子。這將自動修剪報價。

這個程序會做你想做的。它使用您上一個問題的數據。

use strict; 
use warnings; 

print "my %amino_acids = (\n"; 

while (<DATA>) { 
    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"; 

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

輸出

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