我对编程比较陌生。我目前正在学习Perl,遇到了一个逻辑问题,使我无法正确完成脚本。任何帮助都将不胜感激!!提前感谢您的有益见解!
大部分的程序已经写好了,这是让我头疼的最后一步。
我有一个可变的$RNA,它以任意的顺序获取核苷酸序列(acgu)。例如:
$RNA = agcuaggaaggguuuugauag诸若此类。
我已经创建了一个散列,其中每3个核苷酸字符或密码子(例如,uga)被分配到一个定义的氨基酸。例如:
% my AminoAcid = (
ggg => "G",
...
);我要做的是,在哈希字符串中读取起始密码子aug时,打印与散列中密码子对应的定义氨基酸(大写字母),并在哈希中读取停止密码子uga时停止打印定义的氨基酸。
例如:假设$RNA = aaaaugcccgggugaccccccccc。当程序读取字符串中的停止密码子(aug)时,程序应该打印相应的氨基酸(开始为(aug)和停止)。
注意:在读取开始密码子(aug)和读取停止密码子(uga)后的ccccccccccccc之前,应该忽略前三个ccccccccccccc,如果它在字符串中的任何位置再次看到开始密码子aug,则应该重复相同的进程。
我尝试过多种想法,但它们中没有一个接近于描述为最后一部分编写代码的正确方式。我可能没有完全理解它背后的逻辑。
任何帮助都将不胜感激。提前谢谢!
发布于 2014-11-19 19:37:20
这可能有效,将逻辑放在代码组(?{})中
多条线的模型
注:如果需要重新排列(3),请告诉我。
到目前为止,对齐方式是3个非空白+可选空格,重复。
这将在维护3界的同时消耗掉行符--这是我的
假设很重要。
Perl代码
use strict;
use warnings;
my %AminoAcid = (
aug => "Start codon",
ccc => "C",
ggg => "G",
uuu => "U"
);
my $RNA = '
aaaaugcccgggugacccgggcccgggcccaaaauguuugggcccugacccgggccccccaugccc
gggugacccgggcccgggcccaaaauguuugggcccugacccgggcccccc
aaaaugcccgggugacccgggcccgggcccaaaauguuugggcccugacccgggcccccc
aaaaugcccgggugacccgggcccgggcccaaaauguuugggcccugacccgggcccccc
';
my $on = 0;
$RNA =~ /
(?:
( \S\S\S ) \s*
(?{
if ( $^N eq 'aug' ){ $on = 1; print "\n"; }
elsif ( $^N eq 'uga' ) { $on = 0; }
if ( $on ) {
exists $AminoAcid{ $^N } ?
print $AminoAcid{ $^N } :
print "[key not found-> '$^N']";
}
})
)+
/x;输出
Start codonCG
Start codonUGC
Start codonCG
Start codonUGC
Start codonCG
Start codonUGC
Start codonCG
Start codonUGC发布于 2014-11-19 19:18:32
让我们从以下几个方面开始:
my $rna = "aaaaugcccgggugaccccccccc";
my %aminoAcidMap = ( ggg => "G", ccc => "C" );第一步是提取aug和uga之间的相关部分。
$rna =~ /aug((?:[acgu]{3})*?)uga/ or die;
my $pattern = $1;这假设aug可以出现在字符串中的任何位置。此外,如果它跨越两个密码子,它将确保如果它不停止在uga。
如果需要开始密码子位于字符串中可被3整除的索引处,则可以这样做:
$rna =~ /^(?:[acgu]{3})*?aug((?:[acgu]{3})*?)uga/ or die;
my $pattern = $1;此时,$pattern将包含aug和uga之间的部分。
现在,要执行映射,您可以:
my $aminoAcids = $pattern =~ s/[acgu]{3}/$aminoAcidMap{$&}/ger;这将用哈希值替换每个密码子。
如果你把所有东西都装进潜艇里,你就会得到:
sub getAminoAcids {
local ($_) = @_;
/aug((?:[acgu]{3})*?)uga/ or return "";
$1 =~ s/[acgu]{3}/$aminoAcidMap{$&}/ger;
}发布于 2016-03-16 17:42:28
@lucas-trzesniewski的潜艇很棒而且非常紧凑,但是它有一些缺点:它不处理零星的硬回报,只找到第一个蛋白质,不打印第一个蛋氨酸,并且用隐式返回修改$_/$1 (这是我试图避免的)。所以这是一个改进。注意,我自己的翻译脚本非常复杂,可以处理更多的情况(例如,重叠的阅读框架、模糊的核苷酸、RNA片段、交替的起始密码子、多个停止密码子等等),但是如果您只想在有限的情况下使用一些简单的东西,下面是@lucas-trzesniewski子的修改版本,它解决了这些问题:
sub getAminoAcids
{
my $mrna = @_;
$mrna =~ s/\s+//sg;
$mrna = lc($mrna);
my @proteins = ();
while($mrna =~ /(aug(?:[acgu]{3})*?)uga/g)
{
$cds = $1;
push(@proteins,"");
while($cds =~ /(...)/g)
{$proteins[-1] .= $aminoAcidMap{$1}}
}
return(@proteins);
}这假设您不希望在蛋白质字符串中打印停止字符。它也可以有额外的,如错误检查。
https://stackoverflow.com/questions/27024791
复制相似问题