2014-02-16 2 views
1

Я пишу скрипт на языке Perl, который, учитывая список строки в качестве входных данных, похожее на это:Perl скрипт для сжатия строки замены повторяющихся символов

AADDDDKPP PrRRRR 
wwwwwwwwwwYY SSSSS SSSSGGGGGGGGGGGGGG 
ZZZZZFZZQZZZZZZZZZZZZZ 

должен substituite каждый символ, который повторяется более чем в 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]; 
     } 
    } 
} 

Я думаю, что есть более чем один недостаток в этом код, но не может найти, где.

+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,})/length ($ 1). $ 2/ge; ' –

+0

Я довольно noob с регулярным выражением, поэтому я понимаю, что делает остальное ваше регулярное выражение, но все же, что это за \ 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

Смежные вопросы