-5

我得到以下输出:

"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";
}

我怎样才能摆脱我的钥匙周围的双引号?

4

2 回答 2

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"]],
)
于 2013-02-17T19:46:12.397 回答
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
于 2013-02-17T19:07:15.377 回答