2012-04-14 106 views
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被称为)需要打印它的全名。所以,当弦说 ATATCGCG

输出到屏幕上需要读取: 腺嘌呤 胸腺嘧啶 腺嘌呤 胸腺嘧啶 胞嘧啶 鸟嘌呤 胞嘧啶 鸟嘌呤

如果这是太棘手的从字符串做,我可以使用一个数组作为起点。非常感谢你的帮助。

优秀的答案。我们现在将全部设置。

我的另一个问题是关于确保用户只能输入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)"; 
} 

我不完全知道如何回到原来的print语句

回答

3

在配方Processing a String One Character at a Time,我想出了这个:

 
use warnings; 
use strict; 

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

my $string = 'ATATCGCG'; 
my @array = split(//, $string); 
foreach (@array) { 
    my $char = $_; 
    print $nucleotide_bases{$char}, ' '; 
} 

请注意,我正在使用use warningsuse strict(作为初学者,您应该也可以这样做),所以我必须在引号基地名称。此外,该程序在最后打印出额外的空间。

+1

你可以使用'for $ char(split //,$ string)'来保存一些输入,并且IMO使你的代码更清晰。 – TLP 2012-04-14 13:57:07

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", ...); 
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 
+0

优秀的答案。我们现在将全部设置。 我的另一个问题是关于确保用户只能输入DNA碱基(A,T,C和G)。我认为这被称为输入验证。 [CODE] print“请输入您的第一个DNA序列:\ n”; $ userinput1 = <>; chomp $ userinput1; [/ CODE] 您如何在那里添加输入验证?除非条件得到满足,否则应始终重新询问第一份印刷说明。 我知道我需要类似 [CODE [ if($ userinput1 ne'a'or't'or'c'or'g') – Shtanto 2012-04-16 12:28:42

0

总是use strictuse warnings在所有Perl程序的开始处,尤其是那些您正在寻求帮助的程序。这样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"; 
+0

非常好!你可能已经拯救了世界 - 谢谢你:) – Shtanto 2012-04-16 14:44:23