Мне нужно сгруппировать массив строк следующим образом (объединить те же строки рядом)
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
. Как этого избежать?