2012-03-14 207 views
3

我想要計算序列或字符串中A,C和G的數量。我寫了下面的代碼。使用tr ///運算符來計算字符串中的字母

但是,當我打印的值,只有A的打印。 C和G顯示爲零。 在下面的代碼中,我評估A的第一個,但是如果我通過評估C的第一個來切換順序,我得到C的值,但是現在A和G被打印爲零。

誰能告訴我我的代碼有什麼問題嗎?謝謝!

#! /usr/bin/perl 

use strict; 
use warnings; 

open(IN, "200BP_junctions_fasta.faa") or die "Cannot open the file: $!\n"; 
while(<IN>) 
    next if $_ =~ /\>/; 
    my $a = ($_ = tr/A//); 
    my $c = ($_ = tr/C//); 
    my $g = ($_ = tr/G//); 
    print "A:$a, C:$c, G:$g\n"; 
} 

文件如下所示:

> A_Seq 
ATGCTAGCTAGCTAGCTAGTC 
> B_Seq 
ATGCGATCGATCGATCGATAG 

回答

6

更改$_ = tr/$_ =~ tr/。此外,你錯過了while的大括號。

+0

謝謝。這是一個菜鳥的錯誤。 – Jordan 2012-03-14 20:17:43

1

因爲'5'沒有任何'C' s或'G' s在裏面。你是分配的翻譯值$_$_。如果你綁定$_ =~ tr//)的操作到$_,你會得到你想要的結果。

但你真的不需要綁定到上下文變量。綁定使您可以將正則表達式或轉換操作應用於其他變量。你會更好的寫作:

my $a = tr/A//; 
my $c = tr/C//; 
my $g = tr/G//; 

但是你可以像這樣做,太:

$_{$_}++ foreach m/[ACG]/g; 
say "A:$_{A}, C:$_{C}, G:$_{G}"; 
0
open(IN, "input") or die "Cannot open the file: $!\n"; 
while(<IN>) { 
    next if $_ =~ /\>/; 
    my $a = @{[m/(A)/g]}; 
    my $c = @{[m/(C)/g]}; 
    my $g = @{[m/(D)/g]}; 
    print "A:$a, C:$c, G:$g\n"; 
} 
1

,你需要結合運營商的答案,=~而不是分配operat0r ,=,或者您不需要綁定默認變量。

最近,我一直在使用printf爲這些事情:

while(<DATA>) { 
    next if /\>/; 
    printf "A:%s C:%s G:%s\n", tr/A//, tr/C//, tr/G//; 
    } 

我常常希望的是tr///可以插值,所以我可以寫這篇文章,它不起作用:

while(my $line = <DATA>) { 
    next if $line =~ /\>/; 
    print "Line is $_\n"; 
    printf "A:%s C:%s G:%s\n", map { $line =~ tr/$_// } qw(A C G); 
    } 

請注意,如果我在while中使用了默認變量,我將會碰到更多的煩惱$_。我知道我可以做一個eval,但是這不僅更加麻煩,但l4m3:

while(my $line = <DATA>) { 
    next if $line =~ /\>/; 
    print "Line is $_\n"; 
    printf "A:%s C:%s G:%s\n", map { eval "\$line =~ tr/$_//" } qw(A C G); 
    } 

我不應該知道的實施細則,雖然如此,我能夠繼續前進,爲一個子程序,直到我能弄清楚如何擺脫eval,雖然額外的子程序調用可能大數據改寫(munging)減緩:

while(my $line = <DATA>) { 
    next if $line =~ /\>/; 
    print "Line is $line\n"; 
    printf "A:%s C:%s G:%s\n", map { count_bases($line, $_) } qw(A C G); 
    } 

sub count_bases { eval "\$_[0] =~ tr/$_[1]//" } 

很可能有一些聰明的辦法XOR字符串,如果你不喜歡tr///,但我從來沒有花了很長時間才弄清楚(不是說它會比你已經做的更好)。