0

私はPerlを初めて使用し、ファイルの内容を配列に取り込んで、ハッシュのように見える出力を出力するコードを作成する必要があります。 エントリの例を次に示します。

my %amino_acids = (F => ["Phenylalanine", "Phe", ["TTT", "TTC"]])

出力は正確に上記の形式である必要があります。

ファイルの行は次のようになります...

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

セミコロンの後の最後のコドンを取り、最初のグループを無視する必要があります。

4

4 に答える 4

3

同等のハッシュを作成するつもりですか? または、本当に文字列形式が必要ですか? このプログラムはText::CSV、ファイルからハッシュを構築するために使用し、それを使用してダンプしData::Dumpます。これにより、文字列形式も得られます。

use strict;
use warnings;

use Text::CSV;
use Data::Dump 'dump';

my $csv = Text::CSV->new({ sep_char => ':' });
open my $fh, '<', 'amino.txt' or die $!;

my %amino_acids;
while (my $data= $csv->getline($fh)) {
  $amino_acids{$data->[2]} = [
    $data->[0],
    $data->[1],
    [ $data->[4] =~ /[A-Z]+/g ]
  ];
}

print '$amino_acids = ', dump \%amino_acids;

出力

$amino_acids = {
  F => ["Phenylalanine", "Phe", ["TTT", "TTC"]],
  M => ["Methionine", "Met", ["ATG"]],
  P => ["Proline", "Pro", ["CCT", "CCC", "CCA", "CCG"]],
}

アップデート

本当にモジュールをインストールしたくない場合(これは非常に簡単なプロセスであり、コードがより簡潔で信頼できるものになります)、これは必要なことを行います。

use strict;
use warnings;

open my $fh, '<', 'amino.txt' or die $!;

print "my %amino_acids = (\n";

while (<$fh>) {
  chomp;
  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";

出力

my %amino_acids = (
  M => ["Methionine", "Met", ["ATG"]],
  F => ["Phenylalanine", "Phe", ["TTT", "TTC"]],
  P => ["Proline", "Pro", ["CCT", "CCC", "CCA", "CCG"]],
)
于 2013-02-17T12:35:26.997 に答える
0

出力として有効な perl が実際に必要であると仮定すると、次のようになります。

open(my $IN, "<input.txt") or die $!;

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

サンプル行を使用すると、出力は次のようになります。

$amino_acids{"M"} = ["Methionine","Met",["ATG"]];
$amino_acids{"F"} = ["Phenylalanine","Phe",["TTT","TTC"]];
$amino_acids{"P"} = ["Proline","Pro",["CCT","CCC","CCA","CCG"]];
于 2013-02-17T07:59:12.050 に答える
0

@Borodinご回答ありがとうございます。実際には Text::csv または Data::dump を使用する必要はありません。ファイルを開いて、ファイルから同等のハッシュを作成する必要があります。両方、うまくいけばそれが助けになるでしょう.Thanks again!!!

于 2013-02-17T14:31:43.933 に答える
-1

Perl には、ハッシュを出力するための特別な方法はありません。おそらくすべきことは、ファイルを読み取るときにハッシュを作成することです。

while (<FILE>) {
    my @line = split ':'; # split the line into an array
    $amino_acids{$line[0]} = \@line[1..-1]; # take elements 1..end 
}

そして、一度に 1 エントリずつハッシュを出力します。

foreach (keys %amino_acids) {
    print "$_ => [", (join ",", @$amino_acids{$_}), "]\n";
}

これをコンパイルしていないことに注意してください。そのため、完了するには少し作業が必要になる場合があります。

于 2013-02-17T07:42:20.297 に答える