2011-01-27 3 views
0

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

для например: Строка: AGAUUUAGA (т.е. для AGA, ууу, 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"; 
    } 
} 
+0

Пожалуйста, разместите фактический код, в котором вы работаете. Этот код содержит незаконный синтаксис ('elseif'). – toolic

ответ

3

Это 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 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 
     }; 
+0

Не работает со строкой ввода = 'AGAUUUAGAGAAGAG' – Toto

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

Почему foreach вместо этого? – ysth

+0

@ysth, я думаю, он подходит: существует определенное количество захватов для данного регулярного выражения и ввода, таким образом: * 'foreach' * capture, увеличивать количество этой строки. – Axeman

0

Ваша непонятная информация о том, сколько «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; 
+1

Я подумал, что ясно, что он содержит 1 :) – ysth

0

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

my %substring; 
$substring{$1}++ while $seq =~ /(...)/; 
print "There are $substring{UUU} UUU's and $substring{AGA} AGA's\n"; 
Смежные вопросы