3

トラブルシューティングと編集のヘルプを探しています。これは宿題です。私の教授はフォーラムの使用を奨励しています。私はまだ Perl 関数や Subs の経験がないので、理解できるように回答を適切なレベルに制限してください。

スクリプトの目的は、DNA の文字列 (または後で追加するコマンド ラインからのファイル) を読み取り、それを RNA に変換してから、タンパク質の値を大文字の 1 文字のアミノ酸名の形式で返すことです。

スクリプトの機能:

  1. 最初の文字から 3 文字の「コドン」を取得し、それらに 1 文字のシンボル (ハッシュ テーブルからの大文字の 1 文字のアミノ酸名) を付けます。

  2. AUG (「M」) で始まり、UAG、UAA、または UGA で終わる文字列である RNA タンパク質を出力します。

  3. ギャップが発生した場合、新しい行が開始され、プロセスが繰り返されます。ギャップは 3 の倍数であると想定できます。

私が知る限りの主な問題:

  1. ハッシュ テーブルを介してデータをループさせる場所がわかりません。Foreach ブロックの前後に配置してみました。また、Foreach ブロックを完全に取り除き、While & If を試しました。

  2. Foreach ブロックは @all_codons 配列のすべてを処理しておらず、AUG でのみ停止しているようです。

  3. 明らかで最大の問題は、何も返さないことです。どこかで $next_codon 値に「false」が割り当てられています。各行を少しずつコメントアウトしようとしました-何かを返した最後の行は My $start で、そこからはすべてfalseです。

スクリプト:

$^W = 1;
use strict;


my $dna_string = "CCCCAAATGCTGGGATTACAGGCGTGAGCCACCACGCCCGGCCACTTGGCATGAATTTAATTCCCGCCATAAACCTGTGAGATAGGTAATTCTGTTATATCCACTTTACAAATGAAGAGACTGAGGCAAAGAAAGATGATGTAACTTACGCAAAGC";

my %codon_codes = (
    "UUU" => "f", "UUC" => "f", "UUA" => "l", "UUG" => "l",
    "CUU" => "l", "CUC" => "l", "CUA" => "l", "CUG" => "l",
    "AUU" => "i", "AUC" => "i", "AUA" => "i", "AUG" => "m",
    "GUU" => "v", "GUC" => "v", "GUA" => "v", "GUG" => "v",
    "UCU" => "s", "UCC" => "s", "UCA" => "s", "UCG" => "s",
    "CCU" => "p", "CCC" => "p", "CCA" => "p", "CCG" => "p",
    "ACU" => "t", "ACC" => "t", "ACA" => "t", "ACG" => "t", 
    "GCU" => "a", "GCC" => "a", "GCA" => "a", "GCG" => "a",
    "UAU" => "y", "UAC" => "y", "UAA" => " ", "UAG" => " ",
    "CAU" => "h", "CAC" => "h", "CAA" => "q", "CAG" => "q",
    "AAU" => "n", "AAC" => "n", "AAA" => "k", "AAG" => "k"
 );

my $rna_string = $dna_string;
$rna_string =~ tr/[tT]/U/;

my @all_codons = ($rna_string =~ m/.../g);

foreach my $next_codon(@all_codons){
            
    while ($next_codon =~ /AUG/gi){
            
        my $start = pos ($next_codon) -3;
    
        last unless $next_codon =~ /U(AA|GA|AG)/gi;
    
        my $stop = pos($next_codon);
            
        my $genelen = $stop - $start;
            
        my $gene = substr ($next_codon, $start, $genelen);
            
        print "\n" . join($start+1, $stop, $gene,) . "\n";
    }
}
4

1 に答える 1

3

「ハッシュテーブルを介したデータループ」の部分がわかりません。

コドンごとに、それが開始コドン、停止コドン、ギャップ、アミノ酸のいずれであるかを確認する必要があるように思えます。そして、状態を維持するために何らかの方法が必要です(以下のように$in_gene)。

my $in_gene = 0;

foreach my $next_codon(@all_codons){
    if ($next_codon eq 'AUG') {
        $in_gene = 1;
    }
    elsif ($next_codon =~ m/U(AA|GA|AG)/) {
        $in_gene = 0;
    }
    elsif ($in_gene == 1) {
        my $aminoacid = $codon_codes{$next_codon};
        print "\n" and next unless defined $aminoacid;
        print $aminoacid;
    }
}

これは印刷します

l
lqak
l
q
k
于 2010-11-09T07:57:23.080 に答える