开发者

finding the substring present in string and also count the number of occurrences

Could anyone tel me what is the mistake? As the program is for finding the substrings in a given string and count there number of occurrences for those substrings. but the substring must check the occurrences for every three alphabets.

for eg: String: AGAUUUAGA (i.e. for AGA, UUU, AGA)

output: 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++;
        pr开发者_运维知识库int" The number of UUU is $count1";
    }
}


This is a Perl FAQ:

perldoc -q count

This code will count the occurrences of your 2 strings:

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

If you use strict and warnings, you will get many messages pointing out errors in your code.

Here is another approach which is more scalable:

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
        };


Have a try with this, that avoids overlaps:

#!/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";

output:

number of AGA is 2 and number of UUU is 1


This is an example of how quickly you can get things done in Perl. Grouping the strands together as a alternation is one way to make sure there is no overlap. Also a hash is a great way to count occurrences of they key.

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

However, I generally want to generalize it to something like this, thinking that this might not be the only time you have to do something like this.

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";


Your not clear on how many "AGA" the string "AGAGAGA" contains.

If 2,

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

If 3,

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


If I understand you correctly (and certainly that is questionable; almost every answer so far is interpreting your question differently than every other answer):

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜