2010-10-26 30 views
1

J'ai développé un script (principalement en visitant plusieurs solutions et en fusionnant mes préférés) pour trouver et remplacer les mots dans les fichiers. Les fichiers sont tous contenus dans un répertoire. Pour une raison quelconque, mon script va dans une boucle infinie, mais il semble que cela fonctionne.Pourquoi mon script Perl boucle-t-il infiniment?

J'apprécierais toute explication quant à pourquoi il ne sortira pas de la boucle.

#!/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; 
} 

Répondre

13
$i=+1; 

devrait être

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

L'ancien sera mis $i-+1 (par exemple 1) dans chaque boucle, qui toujours inférieur à $count (dans votre cas), de sorte que la boucle won ne sortez pas.

+0

Merci. Évidemment, je suis nouveau à Perl. – MikeKusold

15

C'est pourquoi vous devez toujours activer warnings lors de l'écriture Perl (ainsi que l'utilisation strict):

$ perl -e 'use warnings; my $i; $i =+ 1' 
Reversed += operator at -e line 1.
5

Lorsque vous vous demandez pourquoi une variable n'a pas la valeur que vous attendez, commencer à vérifier les valeurs:

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

vous auriez vu tout de suite que vous n'êtes pas incrémentez $i comme vous pensez que vous êtes.

C'est une pratique de débogage de base. Descendez dans le programme jusqu'à ce que vous atteignez le niveau où vous trouvez qu'il ne fait pas ce que vous pensez qu'il est. Vérifiez tout à chaque étape.

Et, activer les avertissements. :)