为什么我的Perl if条件总是评估为true?

时间:2009-05-27 21:37:37

标签: perl file if-statement file-read

在Perl中,我需要读取包含0或1的.conf文件。如果值为1,我需要执行if语句中的任何内容。这就是我现在所拥有的:

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。 : - )

3 个答案:

答案 0 :(得分:6)

编辑:显然,您的帖子的真值已被反转,您的意思是说if()语句总是执行。这是有道理的。会发生什么是<CONF>读取字符串"1\n""0\n",而不是数字10。尾部换行符会阻止"0"评估为false,因此您需要chomp()它(或使用int()函数,如其他帖子中所述)。无论哪种方式都应该有效。

(请注意,遗憾的是,chomp() 不会返回chomp() ed字符串,而是删除了多少个字符,所以你不能只说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;

答案 1 :(得分:1)

您只需使用int函数将字符串转换为整数。

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

答案 2 :(得分:1)

或者您可以在比较中包含新行:

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