2013-09-29 22 views
1

沒有工作,我有一個字符串的perl如果EQ聲明數組

$seq1= 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT' 

,所以我想找到焦炭從用戶輸入這串的頻。

所以我這個字符串變成數組

$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 =地圖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"; 

這將輸出爲A 16的計數,爲考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);