Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 查找字符串中存在的子字符串,并计算出现的次数_Perl_Parsing - Fatal编程技术网

Perl 查找字符串中存在的子字符串,并计算出现的次数

Perl 查找字符串中存在的子字符串,并计算出现的次数,perl,parsing,Perl,Parsing,有人能告诉我怎么了吗?由于程序用于查找给定字符串中的子字符串,并计算这些子字符串的出现次数。但是子字符串必须检查每三个字母的出现情况 例如:字符串:agauuaga(即用于AGA、UUU、AGA) 产出:AGA-2 UUU-1 print"Enter the mRNA Sequence\n"; $count=0; $count1=0; $seq=<>; chomp($seq); $p=''; $ln=length($seq); $j=$ln/3; for($i=0,$k=0;$i&l

有人能告诉我怎么了吗?由于程序用于查找给定字符串中的子字符串,并计算这些子字符串的出现次数。但是子字符串必须检查每三个字母的出现情况

例如:字符串:agauuaga(即用于AGA、UUU、AGA)

产出:AGA-2 UUU-1

print"Enter the mRNA Sequence\n";
$count=0;
$count1=0;
$seq=<>;
chomp($seq);
$p='';
$ln=length($seq);
$j=$ln/3;
for($i=0,$k=0;$i<$ln,$k<$j;$k++) {
    $fra[$k]=substr($seq,$i,3);
    $i=$i+3;
    if({$fra[$k]} eq AGA) {
        $count++;
        print"The number of AGA is $count";
    } elseif({$fra[$k]} eq UUU) {
        $count1++;
        print" The number of UUU is $count1";
    }
}
print“输入mRNA序列\n”;
$count=0;
$count1=0;
$seq=;
chomp($seq);
$p='';
$ln=长度($seq);
$j=$ln/3;
对于($i=0,$k=0;$i这是一个Perl常见问题解答:

perldoc -q count
此代码将统计两个字符串的出现次数:

use warnings;
use strict;

my $seq = 'AGAUUUAGA';
my $aga_cnt = () = $seq =~ /AGA/g;
my $uuu_cnt = () = $seq =~ /UUU/g;

print "The number of AGA is $aga_cnt\n";
print "The number of UUU is $uuu_cnt\n";

__END__

The number of AGA is 2
The number of UUU is 1
如果您这样做,您将收到许多指出代码中错误的消息

以下是另一种更具可扩展性的方法:

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

my $seq = 'AGAUUUAGA';
my %counts;
for my $key (qw(AGA UUU)) {
    $counts{$key} = () = $seq =~ /$key/g;
}
print Dumper(\%counts);

__END__

$VAR1 = {
          'AGA' => 2,
          'UUU' => 1
        };
这是一个Perl常见问题解答:

perldoc -q count
此代码将统计两个字符串的出现次数:

use warnings;
use strict;

my $seq = 'AGAUUUAGA';
my $aga_cnt = () = $seq =~ /AGA/g;
my $uuu_cnt = () = $seq =~ /UUU/g;

print "The number of AGA is $aga_cnt\n";
print "The number of UUU is $uuu_cnt\n";

__END__

The number of AGA is 2
The number of UUU is 1
如果您这样做,您将收到许多指出代码中错误的消息

以下是另一种更具可扩展性的方法:

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

my $seq = 'AGAUUUAGA';
my %counts;
for my $key (qw(AGA UUU)) {
    $counts{$key} = () = $seq =~ /$key/g;
}
print Dumper(\%counts);

__END__

$VAR1 = {
          'AGA' => 2,
          'UUU' => 1
        };

尝试一下这一点,以避免重叠:

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;
use Data::Dumper;

my $str = q!AGAUUUAGAGAAGAG!;
my @list = $str =~ /(...)/g;
my ($AGA, $UUU);
foreach(@list) {
  $AGA++ if $_ eq 'AGA';
  $UUU++ if $_ eq 'UUU';
}

say "number of AGA is $AGA and number of UUU is $UUU";
输出:

number of AGA is 2 and number of UUU is 1

尝试一下这一点,以避免重叠:

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;
use Data::Dumper;

my $str = q!AGAUUUAGAGAAGAG!;
my @list = $str =~ /(...)/g;
my ($AGA, $UUU);
foreach(@list) {
  $AGA++ if $_ eq 'AGA';
  $UUU++ if $_ eq 'UUU';
}

say "number of AGA is $AGA and number of UUU is $UUU";
输出:

number of AGA is 2 and number of UUU is 1

这是一个在Perl中完成事情的速度的例子。将这些串作为交替项组合在一起是确保没有重叠的一种方法。此外,散列也是计算它们的出现次数的一种很好的方法

$values{$_}++ foreach $seq =~ /(AGA|UUU)/g;
print "AGA-$values{AGA} UUU-$values{UUU}\n";
然而,我通常想把它概括为这样的事情,认为这可能不是你必须做的唯一一次这样的事情

use strict;
use warnings;
use English qw<$LIST_SEPARATOR>;

my %values;
my @spans = qw<AGA UUU>;
my $split_regex 
    = do { local $LIST_SEPARATOR = '|';
           qr/(@spans)/
         }
    ;
$values{$_}++ foreach $seq =~ /$split_regex/g;
print join( ' ', map { "$_-$values{$_}" } @spans ), "\n";
使用严格;
使用警告;
使用英语qw;
我的%价值观;
我的@spans=qw;
我的$split_regex
=do{local$LIST_分隔符='|';
qr/(@span)/
}
;
$values{$\}++foreach$seq=~/$split\u regex/g;
打印连接(“”,映射{$\-$values{$\}}@span),“\n”;

这是一个用Perl完成事情的速度的例子。将这些串作为替代项组合在一起是确保没有重叠的一种方法。此外,哈希也是计算它们的出现次数的一种很好的方法

$values{$_}++ foreach $seq =~ /(AGA|UUU)/g;
print "AGA-$values{AGA} UUU-$values{UUU}\n";
然而,我通常想把它概括为这样的事情,认为这可能不是你必须做的唯一一次这样的事情

use strict;
use warnings;
use English qw<$LIST_SEPARATOR>;

my %values;
my @spans = qw<AGA UUU>;
my $split_regex 
    = do { local $LIST_SEPARATOR = '|';
           qr/(@spans)/
         }
    ;
$values{$_}++ foreach $seq =~ /$split_regex/g;
print join( ' ', map { "$_-$values{$_}" } @spans ), "\n";
使用严格;
使用警告;
使用英语qw;
我的%价值观;
我的@spans=qw;
我的$split_regex
=do{local$LIST_分隔符='|';
qr/(@span)/
}
;
$values{$\}++foreach$seq=~/$split\u regex/g;
打印连接(“”,映射{$\-$values{$\}}@span),“\n”;

您不清楚字符串“AGAGAGA”包含多少个“AGA”

如果2

如果3,


您不清楚字符串“AGAGAGA”包含多少个“AGA”

如果2

如果3,


如果我理解正确(当然这是有问题的;到目前为止,几乎每个答案对你的问题的解释都与其他答案不同):


如果我理解正确(当然这是有问题的;到目前为止,几乎每个答案对你的问题的解释都与其他答案不同):


为什么用foreach而不是while?@ysth,我认为它适合:给定正则表达式和输入有一个可确定的捕获数,因此:
foreach
capture,增加该字符串的计数。为什么用foreach而不是while?@ysth,我认为它适合:给定正则表达式和输入有一个可确定的捕获数,因此:
foreach
capture,增加该字符串的计数。