perl - 集群化(组)字符串数组

标签 perl

我需要按照以下方式对字符串数组进行分组(合并附近的相同字符串)

Input          | Output
---------------+--------------------
[              | [
    'a'        |    'a (x3)',
    'a'        |    'b',
    'a'        |    'c (x2)'
    'b'        |    'd'
    'c'        |    'c'
    'c'        |    'x'
    'd'        | ]
    'c'        |
    'x'        |
]              |
---------------+--------------------

怎么做?

这段代码是我写的

sub str_minus_multiplier {
    my ( $str ) = @_;
    $str =~ s/\(x(\d+)\)//;
    return $str;
}

sub str_add_multiplier {
    my ( $str, $num ) = @_;
    $num = 1 if !defined $num;
    if ( my $n = str_has_multiplier($str) ) {
        $str = str_minus_multiplier($str);
        my $new_m = $n+$num;
        $str.= '(x'.$new_m.')';
    } else {
        $str.= ' (x2)';
    }
    return $str;
}

sub fold_list {
    my ( @x ) = @_;
    for my $i (0 .. $#x-1) {

        my $j = 1;
        while ( str_minus_multiplier($x[$i]) eq $x[$i+$j] ) {
            $x[$i] = str_add_multiplier($x[$i]);
            $j++;
        }
        splice(@x, $i+1, $j-1) if ( $j > 1 );
    }
    return @x;
}

但它没有按预期工作,fold_list() 的输出是

[
          'a (x2)',
          'a',
          'b',
          'c (x2)',
          'd',
          'c',
          'x',
          ' (x2)'
        ];

我猜问题出在str_minus_multiplier($x[$i]) eq $x[$i+$j]比较中,拼接后比较中的一个值是undef。如何避免这种情况?

最佳答案

你可能把问题复杂化了。本质上,这是 run-length encoding 的变体。 .

想法是遍历列表并在每个字符处递增一个计数器以计算“运行”的长度,或者有多少后续字符等于当前字符。找到长度后,以适当的格式将其添加到结果中,并跳过您刚刚压缩在一起的所有元素。

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

my @a = split //, "aaabccdcx";
my @rle;

for (my $i = 0; $i < @a;) {
    my $j = 1;

    while ($i + $j < @a && $a[$i+$j] eq $a[$i]) {
        $j++;
    }

    push @rle, $a[$i] . ($j > 1 ? " (x$j)" : "");
    $i += $j;
}

print Dumper \@rle;

输出:

$VAR1 = [
          'a (x3)',
          'b',
          'c (x2)',
          'd',
          'c',
          'x'
        ];

关于perl - 集群化(组)字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239019/

相关文章:

regex - 为什么我的替代品中的 $1 是空的?

regex - 为什么这个正则表达式调用 substcont 的次数过多?

python - 将数据分箱

html - 参数值在第一个空格处被截断(URL 的其余部分消失)

php - 从 PHP 调用 Perl 脚本并传入变量,同时还使用可变的 perl 脚本名称

regex - bash - 如何从 bash 脚本中将换行符传递给 perl?

regex - unicode 上的字捕获失败错误,如何修复 5.10

perl - 无法使用 perl5.8.4 在 @INC 中运行 perl 程序 : Can't locate Time/Piece. pm 并且无法使用 perl 5.12.3 在 @INC 中找到 DBI.pm

mysql - 为什么 Perl 在此 Munin 脚本中重用相同的 MySQL 连接?

php - Perl 数组/哈希到 php