计算一组字符的重复次数

时间:2014-04-07 17:25:18

标签: perl

我有一个包含以下字符串的.fa文件:

NP_009339.1 NP_009339.1 glutamate dehydrogenase (NADP(+)) GDH3
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXX
XXBBBBBBBBBBBBBBBBBXXXXXBBBBBBBBBBBBBBBBBBBBBBBBBBBBBXXX XX

gi|10383797|ref|NP_009965.2| Rbk1p [Saccharomyces cerevisiae S288c]
AAAAAAAAAAAAAAAAAAAAAAAXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXX
XBBBBBBBBBBBBBBBBBBBXX XXBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

[请注意,在第一个序列的第一行末尾,XXXXX拉伸由返回分隔,在第二行XXXXX由空格分隔,我也希望将它们计算在内。 任何人都可以帮我找到/打印此文件中存在的XXXXX段数,并在output.fa上打印整个序列。已经筋疲力尽了" chomp"忽略/空白。

这是我的剧本:

#!/usr/bin/perl
use warnings;
use strict;    
open my $fh , '<' , 'input.fa' or die 'Cannot open file';
my $Count_XXXXX=0;
while (<$fh>){
chomp;
$Count_XXXXX+=s/X{5}//g;
}
close $fh;
print "\nTotal no of repeats:".$Count_XXXXX."\n";

1 个答案:

答案 0 :(得分:1)

最简单的方法就是删除空格,如果这就是你想要的。以下以段落模式输入您的序列,然后处理$ data:

use strict;
use warnings;

local $/ = "\n\n";

while (<DATA>) {
    chomp;
    my ($label, $data) = split "\n", $_, 2;
    $data =~ s/\s+//g;

    my $count = () = $data =~ m/X{5,}/g;

    print "$count\n";
}

__DATA__
NP_009339.1 NP_009339.1 glutamate dehydrogenase (NADP(+)) GDH3
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXX
XXBBBBBBBBBBBBBBBBBXXXXXBBBBBBBBBBBBBBBBBBBBBBBBBBBBBXXX XX

gi|10383797|ref|NP_009965.2| Rbk1p [Saccharomyces cerevisiae S288c]
AAAAAAAAAAAAAAAAAAAAAAAXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXX
XBBBBBBBBBBBBBBBBBBBXX XXBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

输出:

3
0

<强>更新

要捕获所有匹配项,只需将正则表达式的结果分配给数组:

my $count = my @matches = $data =~ m/X{5,}/g;

注意,我故意让匹配拉5或更多X,因为我假设连续10 X应该算作单个匹配而不是2个匹配。