2

私はいくつかの DNA に取り組んでいます (A、T、C、および G で、U が投入される可能性があります)。

今、私は未定義の長さの DNA でいっぱいの非常に長い文字列を持っています。ヌクレオチド塩基のコードを完成させました。

%nucleotide_bases = ( A => Adenine, 
                      T => Thymine, 
                      G => Guanine, 
                  C => Cytosine );

 $nucleotide_bases{'U'} = 'This is a RNA base called Uracil';#T=U for RNA

あとは、なんらかのループを挿入して、文字列から各文字を読み取るだけです。このコードは学生向けなので、シンプルにする必要があります。私は数週間前に自分でperlを使い始め、その前にJavaを使い始めました。

文字列 ($string1 と呼ばれます) は、1 つの塩基対が (一度に 1 つずつ) 読み取られるときに、完全な名前を出力する必要があります。文字列が ATATCGCG と言うとき

画面への出力は次のように読み取る必要があります。 Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine

文字列からこれを行うのが難しすぎる場合は、配列を出発点として使用できます。あなたの助けに感謝します。

優れた回答。これで準備完了です。

もう 1 つの質問は、ユーザーが DNA 塩基 (A、T、C、G) のみを入力できるようにすることでした。これは入力検証と呼ばれるものだと思います。

print "Please enter your first DNA sequence now: \n";
$userinput1=<>;
chomp $userinput1;

そこに入力検証をどのように追加しますか? 条件が満たされない限り、最初の print ステートメントは常に再確認する必要があります。

私は次のようなものが必要であることを知っています

 if($userinput1 ne 'a' or 't' or 'c' or 'g') {
 print "Please enter DNA only (A, T, C or G)";
 }

元の印刷ステートメントに戻す方法がよくわかりません

4

4 に答える 4

3

一度に1文字ずつ文字列を処理するレシピを使用して、私はこれを思いついた:

警告を使用します。
厳密に使用します。

私の%nucleotide_bases =(A =>'アデニン'、
             T =>'チミン'、
             G =>'グアニン'、
             C =>'シトシン');

私の$string='ATATCGCG';
私の@array=split(//、$ string);
foreach(@array){
    私の$char= $ _;
    印刷$nucleotide_bases{$ char}、'';
}

私はandを使用していることに注意してくださいuse warningsuse strict初心者としては、おそらくあなたもそうしているはずです)ので、ベース名の前後に引用符を追加する必要がありました。また、プログラムは最後に余分なスペースを出力します。

于 2012-04-14T13:47:00.237 に答える
3

文字列からさまざまな文字 A、T、G、C をデコードし、フルネームを出力しようとしていると思います。

print "$nucleotide_bases{$_} " for split //, $string;

または配列を使用します。

my @array = map $nucleotide_bases{$_}, split(//, $string);
print "@array"; # quoted to insert spaces between elements.

の代わりにsplit、正規表現を使用できます。これにより、無関係な文字がデコードされないように除外されます。

my @array = $string =~ /[ATCG]/g;

ああ、ハッシュに値を割り当てるときは、値を引用符で囲む必要があります。ルーク・ガービンのナイスキャッチ。

my %nucleotide_bases = ( A => "Adenine", ... );
于 2012-04-14T13:52:37.827 に答える
0

脚本:

#!/usr/bin/perl

use strict;
use warnings;

my %nucleotide_bases = ( A => 'Adenine',
                         T => 'Thymine',
                         G => 'Guanine',
                         C => 'Cytosine',
                         U => 'Uracil' );

my $string1 = 'ATATCGCG';

$string1 =~ s/([ATGCU])/{$nucleotide_bases{$1}.' '}/ge;

print $string1, "\n";

出力:

Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine 
于 2012-04-14T23:04:09.773 に答える
0

すべての Perl プログラム、特に助けを求めているプログラムの開始時に常に お願いuse strictします。use warningsそうすれば、Perl はあなたが気付いていない多くの単純なエラーを修正し、動作するコードをはるかに迅速に生成できるようになります。

これは、文字列を文字に分割し、ハッシュを使用してそれらを変換し、再度結合することで非常に簡単に実行できます。

このプログラムはそのアイデアを示しています。ハッシュを作成するコードは、提供されたとおりに残していることに注意してください。

use strict;
use warnings;

my %nucleotide_bases = (
  A => 'Adenine', 
  T => 'Thymine', 
  G => 'Guanine', 
  C => 'Cytosine',
);
$nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA

my $chain = 'ATATCGCG';

my $expand = join ' ', map $nucleotide_bases{$_}, split //, $chain;

print $expand, "\n";

出力

Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine

編集

要求に応じて、これはコンソールからシーケンスを読み取り、提供されたシーケンスが無効である限り繰り返すことです。出力は、前のコードと同じです。

use strict;
use warnings;

my %nucleotide_bases = (
  A => 'Adenine', 
  T => 'Thymine', 
  G => 'Guanine', 
  C => 'Cytosine',
);
$nucleotide_bases{'U'} = 'This is a RNA base called Uracil'; #T=U for RNA

my $userinput1;
while () {
  print "Please enter your first DNA sequence now: ";
  chomp ($userinput1 = uc <>);
  last unless $userinput1 =~ /[^ATGC]/;
  printf qq("$userinput1" is an invalid sequence\n);
} 

my $expand = join ' ', map $nucleotide_bases{$_}, split //, $userinput1;

print $expand, "\n";
于 2012-04-16T13:17:12.663 に答える