首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出合适的匹配准则

找出合适的匹配准则
EN

Stack Overflow用户
提问于 2014-11-19 18:58:13
回答 3查看 154关注 0票数 1

我对编程比较陌生。我目前正在学习Perl,遇到了一个逻辑问题,使我无法正确完成脚本。任何帮助都将不胜感激!!提前感谢您的有益见解!

大部分的程序已经写好了,这是让我头疼的最后一步。

我有一个可变的$RNA,它以任意的顺序获取核苷酸序列(acgu)。例如:

代码语言:javascript
复制
$RNA = agcuaggaaggguuuugauag

诸若此类。

我已经创建了一个散列,其中每3个核苷酸字符或密码子(例如,uga)被分配到一个定义的氨基酸。例如:

代码语言:javascript
复制
% my AminoAcid   = (
  ggg => "G",
  ...
);

我要做的是,在哈希字符串中读取起始密码子aug时,打印与散列中密码子对应的定义氨基酸(大写字母),并在哈希中读取停止密码子uga时停止打印定义的氨基酸。

例如:假设$RNA = aaaaugcccgggugaccccccccc。当程序读取字符串中的停止密码子(aug)时,程序应该打印相应的氨基酸(开始为(aug)和停止)。

注意:在读取开始密码子(aug)和读取停止密码子(uga)后的ccccccccccccc之前,应该忽略前三个ccccccccccccc,如果它在字符串中的任何位置再次看到开始密码子aug,则应该重复相同的进程。

我尝试过多种想法,但它们中没有一个接近于描述为最后一部分编写代码的正确方式。我可能没有完全理解它背后的逻辑。

任何帮助都将不胜感激。提前谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-19 19:37:20

这可能有效,将逻辑放在代码组(?{})

多条线的模型

注:如果需要重新排列(3),请告诉我。

到目前为止,对齐方式是3个非空白+可选空格,重复。

这将在维护3界的同时消耗掉行符--这是我的

假设很重要。

Perl代码

代码语言:javascript
复制
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;

输出

代码语言:javascript
复制
Start codonCG
Start codonUGC
Start codonCG
Start codonUGC
Start codonCG
Start codonUGC
Start codonCG
Start codonUGC
票数 1
EN

Stack Overflow用户

发布于 2014-11-19 19:18:32

让我们从以下几个方面开始:

代码语言:javascript
复制
my $rna = "aaaaugcccgggugaccccccccc";
my %aminoAcidMap = ( ggg => "G", ccc => "C" );

第一步是提取auguga之间的相关部分。

代码语言:javascript
复制
$rna =~ /aug((?:[acgu]{3})*?)uga/ or die;
my $pattern = $1;

这假设aug可以出现在字符串中的任何位置。此外,如果它跨越两个密码子,它将确保如果它不停止在uga

如果需要开始密码子位于字符串中可被3整除的索引处,则可以这样做:

代码语言:javascript
复制
$rna =~ /^(?:[acgu]{3})*?aug((?:[acgu]{3})*?)uga/ or die;
my $pattern = $1;

此时,$pattern将包含auguga之间的部分。

现在,要执行映射,您可以:

代码语言:javascript
复制
my $aminoAcids = $pattern =~ s/[acgu]{3}/$aminoAcidMap{$&}/ger;

这将用哈希值替换每个密码子。

如果你把所有东西都装进潜艇里,你就会得到:

代码语言:javascript
复制
sub getAminoAcids {
    local ($_) = @_;
    /aug((?:[acgu]{3})*?)uga/ or return "";
    $1 =~ s/[acgu]{3}/$aminoAcidMap{$&}/ger;
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-16 17:42:28

@lucas-trzesniewski的潜艇很棒而且非常紧凑,但是它有一些缺点:它不处理零星的硬回报,只找到第一个蛋白质,不打印第一个蛋氨酸,并且用隐式返回修改$_/$1 (这是我试图避免的)。所以这是一个改进。注意,我自己的翻译脚本非常复杂,可以处理更多的情况(例如,重叠的阅读框架、模糊的核苷酸、RNA片段、交替的起始密码子、多个停止密码子等等),但是如果您只想在有限的情况下使用一些简单的东西,下面是@lucas-trzesniewski子的修改版本,它解决了这些问题:

代码语言:javascript
复制
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);
  }

这假设您不希望在蛋白质字符串中打印停止字符。它也可以有额外的,如错误检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27024791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档