我正在编写一个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];
}
}
}
我认为此代码中存在多个缺陷,但无法找到。
答案 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