1

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

4

3 回答 3

6

编辑:显然,你的帖子的真值倒置了,你的意思是说 if() 语句总是执行的。这是有道理的。发生的情况是<CONF>读取字符串"1\n"or "0\n",而不是数字1or 0。尾随换行符防止"0"评估为假,因此您需要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;
于 2009-05-27T21:48:00.567 回答
1

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

open(CONF, "/var/web/onhit.conf");
if(int(<CONF>)) {
    print "Hello World!";
}
close(CONF);
于 2009-05-27T21:49:38.723 回答
1

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

if (<CONF> =~ /^1$/) {
}
于 2009-05-28T02:34:39.710 回答