【问题标题】:Perl: Finding _ followed by X with stuff in betweenPerl:查找 _ 后跟 X,中间有东西
【发布时间】:2012-05-13 20:50:12
【问题描述】:

非常感谢您对早期问题的帮助。

我几乎完成了我正在做的最后一件事——特别是一个 ORF(开放阅读框)查找程序。到目前为止,我有一个名为@AminoAcidArray1 的数组。所有的起始密码子都是“_”,所有的终止密码子都是“X”。

如何计算 ORF?换句话说,当“_”后跟“X”且随机可忽略字符之间时,如何计算数组中的次数?我应该使用什么样的循环?我需要一个 ~= 在我认为的某个地方

是的,我知道 bioPerl 可以轻松做到这一点,但由于某种原因,只有 activePerl 可用。

最诚挚的感谢, 什坦托

【问题讨论】:

  • 你能澄清一下你想达到什么目标吗?我不知道你在问什么。
  • 当然。数组@AminoAcidArray1 出现了字符“”和“X”。我想计算找到“”后跟“X”的次数,忽略介于两者之间的任何内容。因此,只要数组中有下划线字符,就会开始一个开放阅读框。每当数组中的下划线后面跟着一个 X 时,开放阅读框就会停止。
  • 您需要知道 ORF 的位置或数量吗?

标签: perl bioinformatics activeperl bioperl


【解决方案1】:

首先,当代 ActivePerl 有 Bundle::BioPerl 在其主要的“Activeperl”存储库中。这应该允许 BioPerl installation 在某些 ActivePerl 版本上。

那么,

print  "$-[0]..$+[0]\n" while $orf =~ /_[^X]*X/g;

打印包含在您的 orfs 中的 start- (_) 和 stop (X) 索引 $orf 如果它们是连续的(不是嵌套的)。如果嵌套,那么你会有 使用稍微复杂的表达式(使用递归)。

顺便说一句:表达式是什么

print join ',', @AminoAcidArray1;

在您的控制台上打印?

rbo

【讨论】:

  • 打印 "$-[0]..$+[0]\n" 而 $orf =~ /_[^X]*X/g;谢谢,那是我所追求的正则表达式。奇怪的是,它并没有打印出任何东西。我必须将它与错误的变量一起使用。第二行使输出看起来很时髦,现在所有的字母都用逗号分隔。非常好:)
  • @Shtanto - “奇怪的是,它并没有打印出任何东西” - 那么你必须插入行 @987654325 @之前所说的那一行。
【解决方案2】:

如果我从您的评论中正确理解:

你有一个数组,你不需要=~ 操作符。

您需要遍历数组一次并记住您所谓的“阅读窗口”的当前状态。说:

my $state = 0;
my $count = 0;
for my $item (@array) {
 if ($item eq "_") {
    if ($state==0) {
       $state=1;
    }
 } elsif ($item eq "X") {
     if ($state==1) {
       $state=0;
       $count++;
    }
 }
}

return $count;

【讨论】:

  • 谢谢卡雷尔。像这样的代码是学生梦寐以求的。我调整了我自己的特定数组名称,将 return 换成一个常见的打印语句和宾果游戏,一切都完成了。这样做的好处是它可以在许多不同的环境中工作。数组遍历是一个常见的程序需求。基于我对 Java 的了解,我知道如何在屏幕上阅读程序逻辑,但自己编写仍然相当棘手。有点像我的德语 :) 很抱歉如此具体。非常感谢您的帮助。
【解决方案3】:

您的问题对您的域来说太具体了,但我的理解是您想计算数组中的一些出现次数,这就是我在以下代码中所做的(我使用perlconsole):

Perl> my @a = qw/az ae ar at ay au pr lf/
8

Perl> my $count = grep /^a/, @a
6

Perl> print "$count\n"
6
1

Perl> 

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2010-11-09
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多