1

我有一个字符串

$seq1= 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'

所以我想从这个字符串中的用户输入中找到 char 的频率。

所以我将此字符串更改为数组

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

然后用for循环计算char的总数

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

但这$Freq1[$i] eq chomp($base)行不通。我不知道为什么?

4

6 回答 6

3

chomp返回删除的总字符数,因此只需 chomp 一次输入并直接比较它。

chomp($base);
for(my $i=0;$i<@Freq1;$i++)
{
    if($Freq1[$i] eq $base)
    {
        print "equals $i\n";
        $numberbase++;
    }
}
于 2013-09-29T09:50:38.643 回答
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
于 2013-09-29T21:08:59.070 回答
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
于 2013-09-29T22:48:05.053 回答
0

如果您只想知道发生的次数,您可以这样做:

chomp $base;
my $numberbase = ($seq1 =~ s/$base/$base/g);
于 2013-09-29T10:02:48.437 回答
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

其工作方式是带有/g修饰符的正则表达式可以返回列表或迭代器,具体取决于上下文。我们想要列表,所以我们强加了一个列表上下文,这就是空括号的作用。然后$count变量赋值在列表上施加一个标量上下文,在这种情况下使它返回其元素的计数。

于 2013-09-29T11:18:24.377 回答
0

或者换一个不同的(或多或少“丑陋”)的版本来计算它们:

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

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';

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

print Dumper(\%u);
于 2013-09-30T20:32:07.947 回答