найти подстроку, присутствующую в строке, а также подсчитать количество вхождений - PullRequest
0 голосов
/ 27 января 2011

Может ли кто-нибудь сказать мне, в чем ошибка?Так как программа предназначена для поиска подстрок в заданной строке и подсчета количества появлений для этих подстрок.но подстрока должна проверять вхождения для каждых трех алфавитов.

, например: String: AGAUUUAGA (то есть для AGA, UUU, AGA)

выход: AGA-2УУУ-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 ]

3 голосов
/ 27 января 2011

Это FAQ по 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 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 голос
/ 27 января 2011

Попробуйте это, чтобы избежать наложений:

#!/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
0 голосов
/ 28 января 2011

Если я вас правильно понимаю (и, конечно, это сомнительно; почти каждый ответ пока интерпретирует ваш вопрос иначе, чем любой другой ответ):

my %substring;
$substring{$1}++ while $seq =~ /(...)/;
print "There are $substring{UUU} UUU's and $substring{AGA} AGA's\n";
0 голосов
/ 28 января 2011

Вы не знаете, сколько "AGA" содержит строка "AGAGAGA".

Если 2,

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

Если 3,

my $aga = () = $seq =~ /A(?=GA)/g;
my $uuu = () = $seq =~ /U(?=UU)/g;
0 голосов
/ 27 января 2011

Это пример того, как быстро вы можете делать вещи в Perl.Группировка нитей вместе в качестве чередования - один из способов убедиться, что нет перекрытия.Кроме того, хэш - отличный способ подсчитать вхождения ключараз вы должны сделать что-то вроде этого.

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...