计算字符在二进制字符串中连续出现的次数 - Perl

时间:2014-03-12 05:38:39

标签: regex perl

我有一个由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);

但是,我想知道正则表达式如何计算连续出现的频率。

2 个答案:

答案 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