为什么“x = a或b”在Perl中不起作用?

时间:2014-09-01 09:58:51

标签: perl if-statement boolean operators

在其他语言中我会写

testvar = onecondition OR anothercondition;

如果任一条件是,则testvar为true。但在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 个答案:

答案 0 :(得分:19)

在表达式周围加上括号

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

答案 1 :(得分:1)

@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";}