2009-05-27 7 views
1

En Perl, j'ai besoin de lire un fichier .conf qui contient un 0 ou un 1. Si la valeur est un, j'ai besoin d'exécuter tout ce qui est dans l'instruction if. Voici ce que j'ai maintenant:Pourquoi ma condition Perl if est-elle toujours vraie?

open(CONF, "/var/web/onhit.conf"); 
if(<CONF>) { 
    print "Hello World!"; 
} 
close(CONF); 

Le contenu de l'instruction if évaluer toujours, même si le fichier .conf contient un 0. Je sais la lecture de fichier est correct, car ce code peut lire correctement le fichier:

open(CONF, "/var/web/onhit.conf"); 
print <CONF>; 
close(CONF); 

Si le fichier contient un 1, il imprime un 1 et vice versa. Est-ce que quelqu'un sait ce qui ne va pas avec mon premier extrait? Désolé, mais je suis un n00b chez Perl. :-)

Répondre

6

EDIT: Apparemment, vous aviez la valeur de vérité de votre poste inversé, et vous vouliez dire que l'instruction if() toujours exécutée. C'est logique. Qu'est-ce qui se passe est que <CONF> lit dans la chaîne "1\n" ou "0\n", pas le numéro 1 ou 0. La nouvelle ligne de fin empêche "0" d'évaluer comme faux, donc vous devez chomp() il (ou utiliser la fonction int(), comme mentionné dans l'autre poste). De toute façon devrait fonctionner.

(Notez que, malheureusement, chomp() ne fait pas retour la chaîne ed chomp(), mais un compte de combien de caractères il supprimé, de sorte que vous ne pouvez pas dire simplement if(chomp(my $tmp = <CONF>)) et faire avec elle.)

quoi qu'il en soit, voici ce que je faisais:

open(CONF, "/var/web/onhit.conf"); 
chomp(my $tmp = <CONF>); 
if($tmp) { 
    print "Hello, world!\n"; 
} 
close CONF; 

quelques recommandations:

  • Envisager d'utiliser la forme à trois arguments de open(), ou au moins en spécifiant "<" devant le nom de fichier.
  • Envisagez d'utiliser une variable pour contenir un descripteur de fichier ($conf) plutôt que d'utiliser l'ancien formulaire de handle de fichier plus lourd (CONF).

C'est le code que je l'aurais écrit:

open my $conf, "<", "/var/web/onhit.conf"; 
chomp(my $tmp = <$conf>); 
if($tmp) { 
    print "Hello, world!\n"; 
} 
close $conf; 
+0

Notez l'utilisation de Chomp() pour supprimer le saut de ligne. Sans cela, vous exécuteriez toujours la vraie branche indépendamment de la valeur. –

+0

OK cela fonctionne. Merci. Vous avez oublié une parenthèse sur la première ligne cependant. Et je l'ai d'ailleurs mal dit sur mon post. L'instruction if est toujours évaluée. C'est corrigé maintenant. –

+0

"Vous avez oublié une parenthèse sur la première ligne cependant." Woops. Fixé. –

1

Il vous suffit de convertir la chaîne en un entier en utilisant la fonction int.

open(CONF, "/var/web/onhit.conf"); 
if(int(<CONF>)) { 
    print "Hello World!"; 
} 
close(CONF); 
1

Ou vous pouvez simplement inclure dans la nouvelle ligne dans la comparaison:

if (<CONF> =~ /^1$/) { 
} 
+1

mais que faire si elles ont omis le retour à la ligne du fichier? :) – ysth

+0

@ysth Êtes-vous heureux maintenant? –

Questions connexes