Почему мой Perl-скрипт зацикливается бесконечно? - PullRequest
1 голос
/ 27 октября 2010

Я разработал скрипт (в основном, посещая несколько решений и объединяя мои любимые) для поиска и замены слов в файлах. Все файлы содержатся в каталоге. По какой-то причине мой сценарий заходит в бесконечный цикл, однако кажется, что он работает.

Буду признателен за любые объяснения, почему он не выйдет из цикла.

#!/usr/bin/perl -i.bak
my $DIRECTORY = '/home/mrk28/testing/findreplace';
opendir (DIR, $DIRECTORY);
@count = readdir(DIR);
my $count = @count;
print $count-2;
my $i = 0;
while ( $i < $count ) {
   s/prods55a/sapprda/;
   $i=+1;
   print;
}

Ответы [ 3 ]

15 голосов
/ 27 октября 2010

Именно поэтому вы всегда должны включать предупреждения при написании Perl (а также при использовании строгого ):

$ perl -e 'use warnings; my $i; $i =+ 1'
Reversed += operator at -e line 1.
13 голосов
/ 27 октября 2010
$i=+1;

должно быть

$i+=1;    # or, ++$i;

Первый установит $i в +1 (т.е. 1) в каждом цикле, что всегда меньше $count (в вашем случае), поэтому цикл не будет завершен.

5 голосов
/ 27 октября 2010

Когда вы удивляетесь, почему какая-то переменная не имеет ожидаемого значения, начните проверять значения:

while ( $i < $count ) {
    s/prods55a/sapprda/;
    $i=+1;
    warn "\$i is now $i\n";
    print;
    }

Вы бы сразу увидели, что вы не увеличиваете $i, как думаетевы.

Это базовая практика отладки.Развернитесь в программе, пока не достигнете уровня, на котором вы обнаружите, что он не делает то, о чем вы думаете.Проверяйте все на каждом шаге.

И включайте предупреждения.:)

...