根据 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
我正在尝试修复 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