给出一个名为file.txt的多fasta文件:
>seq1
CCTTTGGATGGCAAAATTTNTNGTAAA
AGGGCACCCANTTCTGGC
>seq2
NNNNNGGGGCGTAANGAGGGGCACGG
TNCC
>seq3
AAAAAANNNNTAC
我想找到与图案匹配的图案
[NC]。[CT](元素N或C后跟任意元素。后跟元素C或T)
和
[AT] [AN] .. [CG](元素A或T后跟元素A或N,后跟任意两个元素..后跟元素C或G)
对于以符号“>”开头的每个序列,并计算有多少个序列包含该基序。我在这段代码中遇到的主要问题是每个序列的迭代。这是我的代码:
#!/usr/bin/perl -w
use warnings;
if(!open(MY_HANDLE, "file.txt")){
die "Cannot open the file";
}
@content = <MY_HANDLE>;
close(MY_HANDLE);
foreach $row(@content){
chomp($row);
if (@matches1=$row =~ /([AT][AN]..[CG]+)/g) {
$numMat=scalar(@matches1);
print("@matches1,$numMat\n");
}
elsif (@matches2=$row =~ /[NC].[CT]+/g) {
print("@matches2\n");
}
}
非常感谢
答案 0 :(得分:1)
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
sub output {
my ($id, $seq) = @_;
my $count = () = $seq =~ /(?=[NC].[CT]|[AT][AN]..[CG])/g;
say "$id\t$count" if $count;
}
my ($id, $seq);
while (<>) {
chomp;
if (/^>(\S*)/) {
output($id, $seq) if defined $id;
$id = $1;
$seq = "";
} else {
$seq .= $_;
}
}
output($id, $seq);
逐行处理文件。当您遇到序列标头时,请记住ID,否则将序列连接到其前一部分-模式可以在行边界上匹配!
output
会再次被调用,否则最后一个序列将不会被处理。
由于模式可能会重叠,因此我使用了前瞻性(?=...)
进行匹配。