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

Cor*_*ker 1 perl if-statement file file-read

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

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

即使.conf文件包含0,if语句的内容也会始终评估.我知道文件读取是正确的,因为此代码可以正确读取文件:

open(CONF, "/var/web/onhit.conf");
print <CONF>;
close(CONF);
Run Code Online (Sandbox Code Playgroud)

如果文件包含1,则打印1,反之亦然.有谁知道我的第一个片段有什么问题?对不起,我是Perl的n00b.:-)

Chr*_*utz 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;
Run Code Online (Sandbox Code Playgroud)

一些建议:

  • 考虑使用三参数形式open(),或至少指定"<"文件名前面.
  • 考虑使用变量来保存文件句柄($conf)而不是使用较旧的,笨拙的文件句柄形式(CONF).

这是我写的代码:

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