我想格式化我的perl输出

时间:2013-02-17 18:33:54

标签: 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";
}

如何摆脱钥匙周围的双引号?

2 个答案:

答案 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