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)需要在读取每个碱基对时打印它的全名(一次一个)。所以当字符串说 ATTCGCG

屏幕输出需要阅读: Adenine Thymine Adenine Thymine Cytosine Guanine Cytosine Guanine

如果从字符串中执行此操作太棘手,我可以使用数组作为起点。非常感谢您的帮助。

优秀的答案。我们现在都准备好了。

我遇到的另一个问题是关于确保用户只能输入 DNA 碱基(A、T、C 和 G)。我认为这称为输入验证。

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

你将如何在那里添加输入验证?除非满足条件,否则应始终重新询问第一个打印语句。

我知道我需要类似的东西

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

我不完全确定如何回到原来的打印语句

4

4 回答 4

3

使用一次处理一个字符串一个字符的配方,我想出了这个:

使用警告;
使用严格;

我的 %核苷酸碱基 = ( A => '腺嘌呤',
             T => '胸腺嘧啶',
             G => '鸟嘌呤',
             C => '胞嘧啶' );

我的 $string = 'ATATCGCG';
我的@array = split(//, $string);
foreach (@array) {
    我的 $char = $_;
    打印 $核苷酸碱基{$char}, ' ';
}

请注意,我正在使用use warningsand use 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;

哦,当您为哈希分配值时,您需要引用这些值。卢克·格文 ( Luke Girvin ) 的精彩接球。

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 strictuse 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 回答