2012-03-14 107 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///,但我从来没有花了很长时间才弄清楚(不是说它会比你已经做的更好)。