1. here I will use the <> operator
OK、あなたの計画はファイルを一行ずつ読むことです。chomp
進むにつれて各行を忘れないでください。そうしないと、シーケンスに改行文字が含まれることになります。
2. Check to make sure the file only contains acgt or die
if ( <> ne [acgt] ) { die "usage: file must only contain nucleotides \n"; }
whileループでは、明示的に割り当てない限り、<>
演算子は読み取った行を特殊変数に入れます( )。$_
my $line = <>
上記のコードでは、ファイルから1行を読み取り、それを破棄しています。その行を保存する必要があります。
また、ne
演算子は1つの文字列と1つの正規表現ではなく、2つの文字列を比較します。!~
ここで演算子(または=~
否定された文字クラスを持つ演算子)が必要になり[^acgt]
ます。大文字と小文字を区別しないテストが必要な場合は、i
正規表現の一致のフラグを調べてください。
3. Transcribe the DNA to RNA (Every A replaced by U, T replaced by A, C replaced by G, G replaced by C).
GWWが言ったように、あなたの生物学をチェックしてください。T->Uは文字起こしの唯一のステップです。ここでは、tr
(音訳)演算子が役立ちます。
4. Take this transcription & break it into 3 character 'codons' starting at the first occurance of "AUG"
not sure but I'm thinking this is where I will start a %hash variables?
ここではバッファを使用します。while(<>)
ループの外側でスカラーを定義します。index
「AUG」と一致させるために使用します。見つからない場合は、最後の2つのベースをそのスカラーに配置します(これに使用できますsubstr $line, -2, 2
)。ループの次の反復で、.=
これらの2つの塩基に(を使用して)行を追加し、「AUG」を再度テストします。ヒットした場合は、どこにあるかがわかるので、スポットをマークして翻訳を開始できます。
5. Take the 3 character "codons" and give them a single letter Symbol (an uppercase one-letter amino acid name)
Assign a key a value using (there are 70 possibilities here so I'm not sure where to store or how to access)
繰り返しますが、GWWが言ったように、ハッシュテーブルを作成します。
%codons = ( AUG => 'M', ...)
。
次に、(たとえば)split
を使用して、調べている現在の行の配列を作成し、一度に3つの要素のコドンを作成し、ハッシュテーブルから正しいアミノ酸コードを取得できます。
6.If a gap is encountered a new line is started and process is repeated
not sure but we can assume that gaps are multiples of threes.
上記を参照。とのギャップの存在をテストできますexists $codons{$current_codon}
。
7. Am I approaching this the right way? Is there a Perl function that I'm overlooking that can simplify the main program?
上記を見ると、複雑すぎるようです。私はいくつかのビルディングブロックを構築しました。サブルーチンread_codon
とtranslate
:プログラムのロジックに非常に役立つと思います。
これが宿題であることは知っていますが、他の可能なアプローチの感触をつかむのに役立つかもしれないと思います。
use warnings; use strict;
use feature 'state';
# read_codon works by using the new [state][1] feature in Perl 5.10
# both @buffer and $handle represent 'state' on this function:
# Both permits abstracting reading codons from processing the file
# line-by-line.
# Once read_colon is called for the first time, both are initialized.
# Since $handle is a state variable, the current file handle position
# is never reset. Similarly, @buffer always holds whatever was left
# from the previous call.
# The base case is that @buffer contains less than 3bp, in which case
# we need to read a new line, remove the "\n" character,
# split it and push the resulting list to the end of the @buffer.
# If we encounter EOF on the $handle, then we have exhausted the file,
# and the @buffer as well, so we 'return' undef.
# otherwise we pick the first 3bp of the @buffer, join them into a string,
# transcribe it and return it.
sub read_codon {
my ($file) = @_;
state @buffer;
open state $handle, '<', $file or die $!;
if (@buffer < 3) {
my $new_line = scalar <$handle> or return;
chomp $new_line;
push @buffer, split //, $new_line;
}
return transcribe(
join '',
shift @buffer,
shift @buffer,
shift @buffer
);
}
sub transcribe {
my ($codon) = @_;
$codon =~ tr/T/U/;
return $codon;
}
# translate works by using the new [state][1] feature in Perl 5.10
# the $TRANSLATE state is initialized to 0
# as codons are passed to it,
# the sub updates the state according to start and stop codons.
# Since $TRANSLATE is a state variable, it is only initialized once,
# (the first time the sub is called)
# If the current state is 'translating',
# then the sub returns the appropriate amino-acid from the %codes table, if any.
# Thus this provides a logical way to the caller of this sub to determine whether
# it should print an amino-acid or not: if not, the sub will return undef.
# %codes could also be a state variable, but since it is not actually a 'state',
# it is initialized once, in a code block visible form the sub,
# but separate from the rest of the program, since it is 'private' to the sub
{
our %codes = (
AUG => 'M',
...
);
sub translate {
my ($codon) = @_ or return;
state $TRANSLATE = 0;
$TRANSLATE = 1 if $codon =~ m/AUG/i;
$TRANSLATE = 0 if $codon =~ m/U(AA|GA|AG)/i;
return $codes{$codon} if $TRANSLATE;
}
}