perl if eq语句在数组中不起作用

perl if eq语句在数组中不起作用,perl,Perl,我有一根绳子 $seq1= 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT' 所以我想从这个字符串中的用户输入中找到char的频率 所以我把这个字符串改为数组 $base= <STDIN>; # you can input A or T or C or G my @Freq1= split //, $seq1; $base=;#您可以输入A、T、C或G my@Freq1=split/,$seq1; 然后使用for循环计

我有一根绳子

$seq1= 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT'
所以我想从这个字符串中的用户输入中找到char的频率

所以我把这个字符串改为数组

$base= <STDIN>;  # you can input A or T or C or G
my @Freq1= split //, $seq1;
$base=;#您可以输入A、T、C或G
my@Freq1=split/,$seq1;
然后使用for循环计算字符总数

for(my $i=0;$i<@Freq1;$i++) {
  if($Freq1[$i] eq chomp($base)) {
    print "equals $i\n";
    $numberbase++;
  }
}
for(my$i=0;$i返回删除的总字符数,因此只需咀嚼输入一次并直接比较即可

chomp($base);
for(my $i=0;$i<@Freq1;$i++)
{
    if($Freq1[$i] eq $base)
    {
        print "equals $i\n";
        $numberbase++;
    }
}
chomp($base);
for(my$i=0;$i返回移除的总字符数,因此只需咀嚼输入一次并直接比较即可

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

对于(my$i=0;$i如果您只想知道发生的次数,可以执行以下操作:

chomp $base;
my $numberbase = ($seq1 =~ s/$base/$base/g);

如果您只想知道发生的次数,可以执行以下操作:

chomp $base;
my $numberbase = ($seq1 =~ s/$base/$base/g);

如果要计算字符串中某个子字符串的出现次数,可以使用所谓的
=()=
(中间有一组括号的两个等号)

使用严格;
使用警告;
my$seq1='ATCGATGCAATTCCGGAATTCCCGGGGGAAACCCGGGAATTT';
chomp(我的$base=);#用户输入
我的$count=()=$seq1=~/$base/g;
打印“$base在序列中显示$count次\n”;
例如,这将为
a
输出16个计数


其工作方式是,带有
/g
修饰符的正则表达式可以返回列表或迭代器,具体取决于上下文。我们需要列表,因此我们强制执行列表上下文,这就是空括号所做的。然后
$count
变量赋值在列表上强制执行标量上下文,在本例中使其返回元素的计数。

如果要计算字符串中子字符串的出现次数,可以使用所谓的
=()=
(中间有一组括号的两个等号)

使用严格;
使用警告;
my$seq1='ATCGATGCAATTCCGGAATTCCCGGGGGAAACCCGGGAATTT';
chomp(我的$base=);#用户输入
我的$count=()=$seq1=~/$base/g;
打印“$base在序列中显示$count次\n”;
例如,这将为
a
输出16个计数


其工作方式是,带有
/g
修饰符的正则表达式可以返回列表或迭代器,具体取决于上下文。我们需要列表,因此我们强制执行列表上下文,这就是空括号所做的。然后
$count
变量赋值在列表上强制执行标量上下文,在本例中使其返回它的元素计数。

您也可以使用音译来完成此任务,这可能比在每个基上循环更快

#!/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

您还可以使用音译来完成此任务,这可能比在每个基础上循环要快

#!/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

这里没有理由不显示所有计数

使用散列保留所有四个基数的计数,然后在循环中显示其内容

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

这里没有理由不显示所有计数

使用散列保留所有四个基数的计数,然后在循环中显示其内容

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
或者对于不同的(或多或少“丑陋”)版本,将其全部计算在内:

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

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';

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

print Dumper(\%u);
或者对于不同的(或多或少“丑陋”)版本,将其全部计算在内:

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

my $seq1 = 'ATCGATGCAATTCCGGAAAAAATTTTCCCGGGGGGGAAACCCGGGAAATTT';

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

print Dumper(\%u);

my$numberbase=map 1,$seq1=~/(\Q$base\E)/g;
这两种方式都很难看:)
my$numberbase=map 1,$seq1=~/(\Q$base\E)/g;
这两种方式都很难看:)我想知道落选的选民是否有足够的勇气解释自己?如果知道我的答案有任何问题,我将不胜感激。我想知道落选的选民是否有足够的勇气解释自己?如果知道我的答案有任何问题,我将不胜感激。