2009-05-27 104 views
1

在Perl中,我需要讀取包含0或1的.conf文件。如果該值爲1,則需要執行if語句中的任何內容。以下是我現在有:爲什麼我的Perl條件總是評估爲真?

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

if語句的內容始終評估,即使.conf文件中包含了0。我知道文件的理解是正確的,因爲這個代碼可以正確讀取文件:

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

如果文件包含1,則打印1,反之亦然。有人知道我的第一個片段有什麼問題嗎?對不起,我是Perl的n00b。 :-)

回答

6

編輯:顯然,你有你的帖子倒置的真值,而你的意思是說if()語句總是執行。這是有道理的。會發生什麼<CONF>讀取字符串"1\n""0\n",而不是10。尾隨換行符可防止"0"評估爲false,因此您需要chomp()它(或使用int()函數,如其他帖子中所述)。無論哪種方式應該工作。

(需要注意的是,不幸的是,chomp()回報chomp()編輯字符串,但它多少個字符去掉一個算的,所以你不能只是說if(chomp(my $tmp = <CONF>))並用它做。)

無論如何,這是我做過什麼:

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

幾個建議:

  • 考慮使用三個參數的形式open(),或者至少在文件名前面指定"<"
  • 考慮使用變量來保存文件句柄($conf),而不是使用較老的笨拙的文件句柄表單(CONF)。

這是我寫的代碼:

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

的使用注意事項格格的()來刪除的換行符。沒有它,你總是會執行真正的分支,而不管它的值。 – 2009-05-27 21:52:15

+0

行得通。謝謝。儘管你在第一行忘了括號。實際上,我在帖子中說錯了。 if語句總是被評估。現在它已經修復了。 – 2009-05-27 22:18:11

1

您只需將字符串轉換爲使用INT函數的整數。

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

或者你可以只包括在比較換行符:

if (<CONF> =~ /^1$/) { 
} 
相關問題