我有一个字符串
$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)
无效。我不知道为什么?
答案 0 :(得分:3)
chomp返回删除的总字符数,因此只需输入一次并直接比较它。
chomp($base);
for(my $i=0;$i<@Freq1;$i++)
{
if($Freq1[$i] eq $base)
{
print "equals $i\n";
$numberbase++;
}
}
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
如果您只想知道发生次数,可以这样做:
chomp $base;
my $numberbase = ($seq1 =~ s/$base/$base/g);
答案 4 :(得分: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的计数。
这种方法的工作方式是具有/g
修饰符的正则表达式可以返回列表或迭代器,具体取决于上下文。我们想要列表,所以我们强加一个列表上下文,这是空括号的作用。然后$count
变量赋值在列表上强加了一个标量上下文,在这种情况下,它会返回一个元素的计数。
答案 5 :(得分:0)
或者对于不同的(或多或少“丑陋”)版本来计算它们:
use strict; use warnings;
use Data::Dumper;
my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';
my %u;
$seq1 =~ s/./$u{$&}++;$&/ge;
print Dumper(\%u);