Почему мой Perl, если условие всегда оценивается как истинное? - PullRequest
1 голос
/ 28 мая 2009

В Perl мне нужно прочитать файл .conf, который содержит 0 или 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, и наоборот. Кто-нибудь знает, что не так с моим первым фрагментом? Извините, но я n00b в Perl. : -)

Ответы [ 3 ]

6 голосов
/ 28 мая 2009

РЕДАКТИРОВАТЬ: Судя по всему, вы изменили значение истинности вашего сообщения, и вы хотели сказать, что оператор if () всегда выполняется. Это имеет смысл. В результате <CONF> читает в строке "1\n" или "0\n", а не число 1 или 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;
1 голос
/ 28 мая 2009

Или вы можете просто включить символ новой строки в сравнение:

if (<CONF> =~ /^1$/) {
}
1 голос
/ 28 мая 2009

Вам просто нужно преобразовать строку в целое число с помощью функции int.

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