Почему "x = a или b" не работает в Perl?

На других языках я бы написал

testvar = onecondition OR anothercondition;

чтобы testvar был истинным, если любое из условий выполнено. Но в Perl это работает не так, как ожидалось.

Я хочу проверить условие, когда либо переменная содержимого пуста, либо соответствует определенному регулярному выражению. У меня есть этот пример программы:

my $contents = "abcdefg\n";
my $criticalRegEx1 = qr/bcd/;
my $cond1 = ($contents eq "");
my $cond2 = ($contents =~ $criticalRegEx1);
my $res = $cond1 or $cond2;
if($res) {print "One or the other is true.\n";}

Я ожидал бы, что $res будет содержать "1" или что-то, что станет истинным при тестировании с помощью if(). Но он содержит пустую строку.

Как я могу добиться этого в Perl?

2 ответа

Решение

Положите скобки вокруг выражения,

my $res = ($cond1 or $cond2);

или используйте более высокий приоритет || оператор,

my $res = $cond1 || $cond2;

как ваш код интерпретируется Perl как (my $res = $cond1) or $cond2;или, точнее,

perl -MO=Deparse -e '$res = $cond1 or $cond2;'
$cond2 unless $res = $cond1;

Если бы вы использовали use warnings; это также предупредит вас относительно $cond2,

Useless use of a variable in void context

@jackthehipster: Вы все сделали правильно, просто поставьте скобки для $cond1 or $cond2 как показано в приведенном ниже коде:

my $contents = "abcdefg\n";
my $criticalRegEx1 = qr/bcd/;
my $cond1 = ($contents eq "");
my $cond2 = ($contents =~ $criticalRegEx1);
my $res = ($cond1 or $cond2);
if($res) {print "One or the other is true.\n";}
Другие вопросы по тегам