查找字符串中存在的子字符串,并计算出现次数

时间:2011-01-27 13:09:52

标签: perl parsing

有人可以告诉我这是什么错误吗?由于程序用于查找给定字符串中的子字符串并计算这些子字符串的出现次数。但子字符串必须检查每三个字母的出现次数。

例如:字符串:AGAUUUAGA (即AGA,UUU,AGA)

输出:AGA-2         UUU-1

print"Enter the mRNA Sequence\n";
$count=0;
$count1=0;
$seq=<>;
chomp($seq);
$p='';
$ln=length($seq);
$j=$ln/3;
for($i=0,$k=0;$i<$ln,$k<$j;$k++) {
    $fra[$k]=substr($seq,$i,3);
    $i=$i+3;
    if({$fra[$k]} eq AGA) {
        $count++;
        print"The number of AGA is $count";
    } elseif({$fra[$k]} eq UUU) {
        $count1++;
        print" The number of UUU is $count1";
    }
}

5 个答案:

答案 0 :(得分:3)

这是一个Perl常见问题解答:

perldoc -q count

此代码将计算您的2个字符串的出现次数:

use warnings;
use strict;

my $seq = 'AGAUUUAGA';
my $aga_cnt = () = $seq =~ /AGA/g;
my $uuu_cnt = () = $seq =~ /UUU/g;

print "The number of AGA is $aga_cnt\n";
print "The number of UUU is $uuu_cnt\n";

__END__

The number of AGA is 2
The number of UUU is 1

如果您use strict and warnings,您将收到许多指出代码中错误的消息。

这是另一种更具可扩展性的方法:

use warnings;
use strict;
use Data::Dumper;

my $seq = 'AGAUUUAGA';
my %counts;
for my $key (qw(AGA UUU)) {
    $counts{$key} = () = $seq =~ /$key/g;
}
print Dumper(\%counts);

__END__

$VAR1 = {
          'AGA' => 2,
          'UUU' => 1
        };

答案 1 :(得分:1)

试试这个,避免重叠:

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;
use Data::Dumper;

my $str = q!AGAUUUAGAGAAGAG!;
my @list = $str =~ /(...)/g;
my ($AGA, $UUU);
foreach(@list) {
  $AGA++ if $_ eq 'AGA';
  $UUU++ if $_ eq 'UUU';
}

say "number of AGA is $AGA and number of UUU is $UUU";

<强>输出:

number of AGA is 2 and number of UUU is 1

答案 2 :(得分:0)

这是一个在Perl中完成工作的速度的示例。将股线组合在一起作为交替是确保没有重叠的一种方法。此外,哈希是计算密钥出现次数的好方法。

$values{$_}++ foreach $seq =~ /(AGA|UUU)/g;
print "AGA-$values{AGA} UUU-$values{UUU}\n";

但是,我通常希望将它概括为类似的东西,认为这可能不是你必须做这样的事情的唯一时间。

use strict;
use warnings;
use English qw<$LIST_SEPARATOR>;

my %values;
my @spans = qw<AGA UUU>;
my $split_regex 
    = do { local $LIST_SEPARATOR = '|';
           qr/(@spans)/
         }
    ;
$values{$_}++ foreach $seq =~ /$split_regex/g;
print join( ' ', map { "$_-$values{$_}" } @spans ), "\n";

答案 3 :(得分:0)

你不清楚字符串“AGAGAGA”包含多少“AGA”。

如果是2,

my $aga = () = $seq =~ /AGA/g;
my $uuu = () = $seq =~ /UUU/g;

如果是3,

my $aga = () = $seq =~ /A(?=GA)/g;
my $uuu = () = $seq =~ /U(?=UU)/g;

答案 4 :(得分:0)

如果我理解正确(当然这是有问题的;到目前为止,几乎每个答案都以不同于其他答案的方式解释你的问题):

my %substring;
$substring{$1}++ while $seq =~ /(...)/;
print "There are $substring{UUU} UUU's and $substring{AGA} AGA's\n";