2013-09-29 2 views
1

у меня есть строкаPerl, если эк заявление не работают в массиве

$seq1= 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT' 

так я хочу найти fréquence обугленного из пользовательского ввода в этой строке.

Так я изменить эту строку на массив

$base= <STDIN>; # you can input A or T or C or G 
my @Freq1= split //, $seq1; 

Затем используйте цикл для расчета общего количества полукокса

for(my $i=0;$i<@Freq1;$i++) { 
    if($Freq1[$i] eq chomp($base)) { 
    print "equals $i\n"; 
    $numberbase++; 
    } 
} 

Но $Freq1[$i] eq chomp($base) не может работать. Я не знаю почему?

ответ

3

chomp возвращает общее количество удаленных символов, поэтому просто введите один раз и сравните его.

chomp($base); 
for(my $i=0;$i<@Freq1;$i++) 
{ 
    if($Freq1[$i] eq $base) 
    { 
     print "equals $i\n"; 
     $numberbase++; 
    } 
} 
+0

это работает, спасибо – AntiGMO

0

Если вы просто хотите знать количество возникновения, вы можете сделать:

chomp $base; 
my $numberbase = ($seq1 =~ s/$base/$base/g); 
+0

'мой $ NumberBase = map 1, $ seq1 = ~/(\ Q $ base \ E)/g; 'это безобразно в любом случае :) –

0

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

use strict; 
use warnings; 

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'; 
chomp(my $base = <>); # user input 
my $count =() = $seq1 =~ /$base/g; 
print "$base is seen $count times in the sequence\n"; 

Это будет выводить кол-16 для A, для экзамена PLE.

Как это работает, регулярное выражение с модификатором /g может возвращать либо список, либо итератор, в зависимости от контекста. Нам нужен список, поэтому мы накладываем контекст списка, что и делают пустые круглые скобки. Затем присваивание переменной $count накладывает на список скалярный контекст, который в этом случае возвращает его количество.

2

Вы также можете использовать транслитерацию для этой задачи, которая, скорее всего, будет быстрее, чем переключение по каждой базе.

#!/usr/bin/env perl                                      

use strict; 
use warnings; 

my $seq = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'; 
my $count = ($seq =~ tr/Aa//); 
print "A is seen $count times.\n"; 

Или вы можете просто использовать BioPerl для получения статистики по последовательности.

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Bio::Tools::SeqStats; 

my $seqobj = Bio::PrimarySeq->new(-seq => 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT', 
            -alphabet => 'dna', 
            -id => 'test'); 

my $seq_stats = Bio::Tools::SeqStats->new(-seq => $seqobj); 
my $hash_ref = $seq_stats->count_monomers(); 

for my $base (sort keys %$hash_ref) { 
    print "Number of bases of type ", $base, " = ", $hash_ref->{$base},"\n"; 
} 

Выход:

Number of bases of type A = 16 
Number of bases of type C = 10 
Number of bases of type G = 14 
Number of bases of type T = 11 
1

Там нет причин здесь не просто отображать все графов.

Используйте хеш для хранения отсчетов всех четырех оснований и последующего отображения его содержимого в цикле.

use strict; 
use warnings; 

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'; 

my %counts; 
$counts{$_} += 1 for split //, $seq1; 

printf "%s => %d\n", $_, $counts{$_} // 0 for qw/ A C G T /; 

выход

A => 16 
C => 10 
G => 14 
T => 11 
+0

Интересно, достаточно ли смехотворник, чтобы объяснить себя? Я был бы признателен за любые проблемы с моим ответом. – Borodin

0

Или другой (более или менее 'некрасиво') версии сосчитать их все:

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

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'; 

my %u; 
$seq1 =~ s/./$u{$&}++;$&/ge; 

print Dumper(\%u); 
Смежные вопросы