我有一个由1和破折号组成的二进制$字符串列表。
1--1-1-111---1--
1--1-11111111-11
1111-11111--1111
我从txt文件中检索这个,以计算每个字符串中存在多少连续破折号。例如,在第一个字符串中,存在一连串3个连续破折号,两次破折次,两次破折次3次。在第二个字符串中,我有一段连续2个短划线,两次出现一个短划线。
我希望的结果是输出,或保持数组或散列以进行进一步操作,连续短划线的出现以及此表示法中的频率:
3-1, 2-2, 1-3
2-1, 1-2
2-1, 1-1
我使用此语句来计算全局破折号的出现次数:
$dash_freq = (($string =~ tr/-//) + 1);
但是,我想知道正则表达式如何计算连续出现的频率。
答案 0 :(得分:5)
也许以下内容会有所帮助:
use strict;
use warnings;
while (<DATA>) {
my ( %hash, @nums );
$hash{ length $1 }++ while /(-+)/g;
push @nums, "$_-$hash{$_}" for sort { $b <=> $a } keys %hash;
print join( ', ', @nums ), "\n";
}
__DATA__
1--1-1-111---1--
1--1-11111111-11
1111-11111--1111
输出:
3-1, 2-2, 1-2
2-1, 1-2
2-1, 1-1
答案 1 :(得分:1)
您还可以使用split
提取短划线列表,如下所示:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
my @dash_freq;
while (<DATA>) {
chomp;
my @dashes = split /1+/;
my %freq;
$freq{length($_)}++ foreach grep { m/-/ } @dashes;
push @dash_freq, \%freq;
}
print Dumper(\@dash_freq);
__DATA__
1--1-1-111---1--
1--1-11111111-11
1111-11111--1111
---1111-11111--1111