2009-05-27 11 views
1

In Perl muss ich eine .conf-Datei lesen, die entweder eine 0 oder eine 1 enthält. Wenn der Wert eins ist, muss ich ausführen, was in der if-Anweisung ist. Hier ist, was ich habe jetzt:Warum wird meine Perl-Bedingung immer als wahr bewertet?

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

Der Inhalt der if-Anweisung immer zu bewerten, auch wenn die Conf-Datei enthält eine 0 Ich weiß, dass die Datei lesen korrekt ist, da dieser Code die Datei korrekt lesen kann:

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

Wenn die Datei eine 1 enthält, wird eine 1 gedruckt und umgekehrt. Weiß jemand, was mit meinem ersten Ausschnitt falsch ist? Sorry, aber ich bin ein n00b bei Perl. :-)

Antwort

6

EDIT: Anscheinend hatten Sie den Wahrheitswert Ihrer Post invertiert, und Sie wollten sagen, dass die if() Anweisung immer ausgeführt wird. Das macht Sinn. Was passiert ist, dass <CONF> liest die Zeichenfolge "1\n" oder "0\n", nicht die Nummer 1 oder 0. Der abschließende Zeilenumbruch verhindert, dass "0" als falsch ausgewertet wird, also müssen Sie chomp() es (oder verwenden Sie die int() Funktion, wie in dem anderen Beitrag erwähnt). So oder so sollte es funktionieren.

(Beachten Sie, dass leider tut chomp()nicht Rückkehr der chomp() ed String, sondern eine Zahl, wie viele Zeichen es entfernt, kann man einfach if(chomp(my $tmp = <CONF>)) so nicht sagen, und mit ihr geschehen.)

Wie auch immer, das ist, was ich getan habe:

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

einige Empfehlungen:

  • Erwägen Sie die Verwendung die Drei-Argumente-Form von open(), oder mindestens "<" vor dem Dateinamen angeben.
  • Verwenden Sie eine Variable, um ein Dateihandle ($conf) zu halten, anstatt das ältere, schwerfälligere Dateihandleformular (CONF) zu verwenden.

Dies ist der Code, den ich geschrieben hätte:

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

Beachten Sie die Verwendung von chomp(), um das Newline zu entfernen. Ohne sie würden Sie immer den wahren Zweig unabhängig vom Wert ausführen. –

+0

OK, das funktioniert. Vielen Dank. Sie haben jedoch in der ersten Zeile eine Klammer vergessen. Und ich habe es tatsächlich falsch auf meinem Post gesagt. Die if-Anweisung wird immer ausgewertet. Es ist jetzt aber behoben. –

+0

"Sie haben jedoch eine Klammer in der ersten Zeile vergessen." Woops. Fest. –

1

Sie müssen lediglich die Zeichenfolge in eine ganze Zahl mit der Funktion int konvertieren.

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

Oder Sie könnten nur in der Newline im Vergleich:

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

aber was ist, wenn sie den Zeilenumbruch aus der Datei weggelassen haben? :) – ysth

+0

@ysth Bist du jetzt glücklich? –

Verwandte Themen