2009-05-27 5 views
1

Perlでは、0または1のいずれかを含む.confファイルを読む必要があります。値が1の場合は、if文にあるものを実行する必要があります。 if文のPerl if条件が常にtrueに評価されるのはなぜですか?

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

内容を常に.confファイルは、このコードは正しくファイルを読むことができるので、0が、私は、ファイルの読み込みが正しいことを知っている含まれている場合でも、評価する:ここで私は今持っているものである

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

ファイルに1が含まれている場合は、1が出力され、その逆も同様です。誰かが私の最初のスニペットで間違っていることを知っていますか?申し訳ありませんが、私はPerlでn00bです。 :-)

答えて

6

編集:明らかに、あなたのポストの真理値は逆転していて、if()文は常にが実行されたと言っていました。意味あり。文字列"1\n"または"0\n"をで読み取り、数値1または0ではありません。末尾改行は"0"が偽と評価されないようにするため、chomp()にする必要があります(または、別の記事で述べたようにint()関数を使用してください)。どちらの方法でも動作するはずです。

(あなただけif(chomp(my $tmp = <CONF>))を言うことができないし、それを行うことので、残念ながら、chomp()chomp()編文字列を返しますが、それは削除文字数のカウントしない、ということに注意してください。)

とにかく、これは私がやったことです:

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

いくつかの提言:

  • が使用することを検討してください3つの引数の形式open()、または少なくともファイル名の前に"<"を指定します。
  • より古いclumsierファイルハンドルフォーム(CONF)ではなく、ファイルハンドル($conf)を保持するために変数を使用することを検討してください。

これは私が書かれていたコードです:

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

改行を削除する)(ムシャムシャ食べるの使用に注意してください。それがなければ、値に関係なく常に真のブランチを実行します。 –

+0

これでOKです。ありがとう。あなたは最初の行にかっこを忘れてしまった。そして私は実際に私のポストでそれを間違って言った。 if文は常に評価されます。しかし今は修正されました。 –

+0

"最初の行に括弧を忘れてしまった。" Woops。一定。 –

1

あなたは単にint型の関数を使って文字列を整数に変換する必要があります。

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

それとも、ただの比較で改行に含めることができます

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

しかし、ファイルから改行を省略した場合はどうなりますか? :) – ysth

+0

@ysthあなたは今幸せですか? –