我得到以下输出:
"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";
}
如何摆脱钥匙周围的双引号?
答案 0 :(得分: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"]],
)
答案 1 :(得分:1)
双引号似乎是各自字符串的一部分。这表明您的解析可能已被破坏。你给出的循环作为代码示例也没有多大意义(重新定义你在循环中循环的变量,即使它应该是无害的,也是不好的样式)。
好像你想要
my @genetic_codes = /(?:\A|(?<=:)) "([^"]*)" (?=:|\z)/xg; # not tested
...;
或
my @genetic_codes = split /:/;
s/^"//, s/"$// for @genetic_codes;
...;
或沿着这些方向的东西。
第一种可能性用split
和列表上下文替换大致等效的正则表达式应用程序/g
。
第二个解决方案可能更可取,并从@genetic_codes
中的所有元素中删除所有前导和尾随空格。这种解决方案可能更灵活,更不容易出错。
提示:您可以执行
,而不是拆分/加入(my $group = $genetic_codes[4]) =~ s/(?<=,)\s+//g; # remove whitespace after every comma