2014-10-15 2 views
0

У меня есть слово (МОДЕЛЬ 1) в моем файле 20 раз, перемежаемое строками текста. Я хочу заменить его частотным числом появления, например. MODEL 1, а затем, когда это произойдет снова, тогда MODEL 2, а затем MODEL 3 и так далее.Периодическая замена с использованием Perl

Однако моя петля застревает в первом раунде и не зацикливается, пока не заменит все слова.

Может ли кто-нибудь сказать мне, что я упускаю. Любая помощь приветствуется.

код приведен ниже:

#!/usr/bin/perl -w 

my $file = 'test.text'; 
open (my $fh, $file); 

while (my $row = <$fh>) { 

    chomp $row; 
    if (($row) =~ /^MODEL 1/){ 

     $i = 1; 
     $row =~ s/^MODEL 1/MODEL $i/g; 
     $i++; 
    } 

    print "$row\n"; 
} 
+1

Это MODEL 1 в начале строки? Если нет, удалите^char –

+0

Будет ли более одного МОДЕЛИ 1 в строке? –

ответ

1

Move $i = 1 инициализации выше while петли

$i = 1; 
while (my $row = <$fh>) { chomp $row; 
    ... 
} 

Вы сбросить его обратно для каждой строки, так что не будет каких-либо изменений вообще.

+0

Если вы используете регулярное выражение OP, это не работает для нескольких замещений в одной строке. –

1

Вы можете увеличивать счетчик в самой замене модели с модификатором е:

my $i=1; 
while (my $row = <$fh>) { 
    chomp $row; 
    $row =~ s/MODEL \K1/$i++/ge 
    print "$row\n"; 
} 
3

Вы должны переместить переменный счетчик вне цикла.

Как упрощение, используйте s///e, чтобы соответствовать и заменить на один шаг:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use autodie; 

my $file = 'test.text'; 

open my $fh, '<', $file; 

my $counter = 0; 

while (<$fh>) { 
    chomp; 

    s/^MODEL \K1/++$counter/e; 

    print "$_\n"; 
} 
+0

Я бы добавил флаг 'g', так как OP имеет его. –

+1

Да, его регулярное выражение имеет/g. Однако он также привязан к началу строки. Поэтому может быть только 1 совпадение. – Miller

+0

о, незначительный недосмотр на моей стороне, извините. –

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