-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最初の可能性は、 yourをほぼ同等の正規表現アプリケーション/gと list コンテキストに置き換えます。

2 番目の解決策が望ましい場合があり、@genetic_codes. このソリューションは、より柔軟で、エラーが発生しにくい可能性があります。

ヒント: 分割/結合の代わりに、そのまま実行できます

(my $group = $genetic_codes[4]) =~ s/(?<=,)\s+//g; # remove whitespace after every comma
于 2013-02-17T19:07:15.377 に答える