根据 Perl 中的用户输入查找模式 mulifasta 列表

Find pattern mulifasta list based on user input in Perl

我正在尝试修复 Perl 代码。鉴于以下 "file.txt":

>otu1  
AACGCCTTTCCNGGATGGCAAAATTTNTNGTAAA
AGGGCACCCANTTCTGGCTCGAAA  
>otu2
NNAATCGGNNNGGGGCGTAANGAGGTTNCGGCACGG
TNCCCGTTTANCG
>otu3   
CTGGNATAAAAAANNNNTACTTAA

在调用程序时提供一个otu编号作为参数(即otu2)后, 我想首先 (1) 检查 file.txt 中是否存在那个 otu, 然后 (2) 在 otu 序列中找到模式 [NC].[CT](元素 N 或 C,后跟任何元素 . 然后是元素 C 或 T),最后 (3) 打印出每个站点的开始和结束位置。

对于前两个问题,我正在尝试使用以下代码,但在集成子例程时遇到了问题。


#!/usr/bin/perl -w

use warnings;
use strict;

$otu = $ARGV[0];   
check_otu("file.txt");

sub check_otu {
    my $content = shift;
    open(my $fh, '<' , $content) || die "File not found: $!";
    my $content;    

    while( my $line = <$fh> ) {
        if ( $line =~ /^>/ ) {
            check_pattern($content) if $content=$otu;
            $content = $line;
        }
        else {
            $content .= $line;
        }
    }
    check_motifs($content);
}

}
sub check_pattern{
    my $fasta = $content;
    $count++ if count_pattern($fasta);
}
sub count_pattern {
    my $chain = $content;
    my @all = $chain =~ /([NC].[CT])/g;
    scalar @all;
}

我遇到了这些错误:

"my" variable $content masks earlier declaration in same scope at proof.pl line 12.
Name "main::count" used only once: possible typo at proof.pl line 28.
Undefined subroutine &main::check_motifs called at proof.pl line 23, <$fh> line 8.

您有什么建议吗?第三个问题有提示吗? 感谢您的帮助

bioperl makes it easy 读取 fasta 文件。使用它而不是试图重新发明轮子。

特殊变量 @-@+ 保存最后一个匹配模式的开始和结束的索引(以及其中的任何捕获组)。你的第三个比特需要它。

你可能会得到类似这样的结果:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use Bio::SeqIO;

my ($file, $otu) = @ARGV;
my $fasta = Bio::SeqIO->new(-file => $file, -format => 'fasta');
my $found = 0;

while (my $seq = $fasta->next_seq()) {
  next unless $seq->primary_id() eq $otu;
  $found = 1;
  my $s = $seq->seq();
  while ($s =~ m/[NC].[CT]/g) {
    my $start = $-[0];
    my $stop = $+[0] - 1; # Index in this array is 1 past the last character
    say "$start $stop";
  }
}

say "$otu not found" unless $found;

示例:

$ perl otu.pl sample.fasta otu2
15 17
31 33
37 39
40 42