我正在研究一些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)";
}
我不完全确定如何回到原始的印刷声明
答案 0 :(得分: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 warnings
和use strict
(作为初学者,您可能也应该这样做),因此我必须在基本名称周围添加引号。此外,该程序最后打印出一个额外的空间。
答案 1 :(得分: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", ... );
答案 2 :(得分: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
答案 3 :(得分: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";