Perl脚本压缩字符串替换重复的字符

时间:2014-02-16 12:11:53

标签: string perl

我正在编写一个perl脚本,给定一个字符串列表作为输入,类似于:

AADDDDKPP PrRRRR
wwwwwwwwwwYY SSSSS SSSSGGGGGGGGGGGGGG
ZZZZZFZZQZZZZZZZZZZZZZ

应该将每个连续重复2次以上的字符替换为字符后面的重复次数。因此,通过上面显示的输入,脚本应该输出这些字符串:

AA4DKPP Pr4R
10wYY 5S 4S14G
5ZFZZQ13Z

这是我到目前为止写的perl脚本:

foreach my $line(@lines){
    @letters=split("",$line);
    @alreadyChecked=();
    foreach my $letter(@letters){
        $count=0;
        if (grep {$letter} @alreadyChecked) {
            next;
        }
        push(@alreadyChecked,$letter);
        foreach my $index(@letters){
            if($letter eq $index){
                $count=$count+1;
            } else {
                @alreadyChecked=0;
                last;
            }  
        }
        if($count>2){
            @chops=split(/$letter+/,$line);
            $line=$chops[0].$count.$letter.$chops[1];
        }
    }
}

我认为此代码中存在多个缺陷,但无法找到。

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式替换来解决此问题:

perl -plwe's/((.)\2\2+)/length($1) . $2/eg'

这将检查由内括号捕获的字符\2的重复,并将其替换为表示整个匹配$1的长度的数字,后跟字符本身{{1} }。脚本版本可能类似于:

$2

答案 1 :(得分:2)

my $str ="
AADDDDKPP PrRRRR
wwwwwwwwwwYY SSSSS SSSSGGGGGGGGGGGGGG
ZZZZZFZZQZZZZZZZZZZZZZ
";

$str =~ s/((.)\2{2,})/ length($1) . $2  /ge;

print $str;

输出

AA4DKPP Pr4R
10wYY 5S 4S14G
5ZFZZQ13Z