2014-02-16 49 views
1

我正在寫一個Perl腳本,作爲輸入字符串列表,與此類似:Perl腳本來壓縮字符串替換重複字符

AADDDDKPP PrRRRR 
wwwwwwwwwwYY SSSSS SSSSGGGGGGGGGGGGGG 
ZZZZZFZZQZZZZZZZZZZZZZ 

應該substituite每次重複2次以上的字符連續跟隨char的重複次數。因此,與輸入上面顯示,該腳本應在輸出給這些字符串:

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]; 
     } 
    } 
} 

我覺得有一個以上的缺陷在這個代碼,但無法找到位置。

+1

你怎麼想輸入字符串的數字處理?你的例子不包括任何,所以也許沒有。但是澄清會有幫助。 – AdrianHHH

+0

你爲什麼要這樣,特別是壓縮字符串? – ysth

+0

@ysth這只是一個鍛鍊我在做我自己。 – Andrew

回答

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 
+0

非常感謝。方式更快,更精美。 – Andrew

+0

@TLP不知道你在說什麼,我看到你的答案,我已經發布之後'S /((。)\ 2 {2})/長度($ 1)。 $ 2/GE;' –

+0

我用正則表達式相當小白,所以我得到了你的正則表達式的其餘部分做什麼,但仍,那是什麼\ 2?再次感謝。 – Andrew

2

可以與正則表達式替換解決這個問題:

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

這將檢查字符\2,由內括號捕獲的重複,並與表示整個匹配$1的長度的號碼替換它其次是字符本身$2。腳本版本可能是這樣的:

use strict; 
use warnings; 

while (<>) { 
    s/((.)\2\2+)/length($1) . $2/eg; 
    print; 
} 
+0

非常感謝!正則表達式的力量。 – Andrew