这个if语句有什么问题?

时间:2011-04-11 08:56:43

标签: perl

我有这段代码

#!/usr/bin/perl

use warnings;
use strict;

my $nis = "qqq";
my $grp = "pre-qqq";

if ($nis eq $grp || 'pre-' . $nis eq $grp) {
    print "match1\n";
}

if (($nis || 'pre-' . $nis) eq $grp) {
    print "match2\n";
}

第一个if - 语句有效,但第二个没有。

第二个出了什么问题?

可以在不重复两次变量的情况下完成吗?

5 个答案:

答案 0 :(得分:5)

因为第一次进行(可能)两次比较,首先将$nis$grp进行比较,如果失败,则将'pre-'.$nis$grp进行比较,而第二次只会比较$nis || 'pre-'.$nis$grp$nis || 'pre-'.$nis进行单一比较。

您的问题是,$nis不是quantum superposition,根据您的查看方式,它可以取任何一个值,它是单个值{{1 } 'pre-'.$nis。如果$nis是真实的(也就是说,它不是空字符串,undef,数字0或字符串“0”),那么该值将是$nis。如果不是,那么该值将为'pre-'.$nis(根据真实性规则,这意味着'pre-'.$nis只会是'pre-''pre-0'

如果要与两个值进行比较,通常需要进行两次比较...但是可以通过使您针对正则表达式测试的值在一个步骤中执行此特定比较:

if ($grp =~ /^(:?pre-)?$nis/) {
    print "match3\n";
}

但是,为了便于阅读,我会坚持使用您的第一次比较。

答案 1 :(得分:4)

错误的是“(A或B)等于C”和“(A等于C)或(B等于C)”意味着完全不同的东西。在您的第二个if中,您首先要求Perl计算$nis || 'pre-'.$nis,然后查看它是否等于$grp

计算$nis || 'pre-'.$nis(有点)将$nis'pre-'.$nis视为布尔值(true / false)。更准确地说,如果不是Perl认为“假”的值,则结果等于$nis;否则它等于'pre-'.$nis。在这种情况下,"qqq"不是false,因此值只是"qqq"。由于这不等于$grp,因此第二个if中的条件为false。

在普通语言中,如果你说“3或6是素数”或“乔或鲍勃是艾伦的兄弟”,人类听众会以我认为你想要你的第二个if的方式来解释被解释。但这并不是我所知道的任何计算机语言的作用方式。 (半例外:Grisworld的“Icon”。)

答案 2 :(得分:2)

if ( $grp ~~ [ $nis, "pre-$nis" ] ) {
    print "match\n";
}

或(5.10.1之前)

if ( grep $_ eq $grp, $nis, "pre-$nis" ) {
    print "match\n";
}

答案 3 :(得分:1)

($ nis ||'pre-'。$ nis)评估为'pre-'。 $ nis仅当$ nis未定义,0或空字符串时。 所以在你的情况下,它总是被评估为($ nis eq $ grp){... 坚持你的第一种方法,你会没事的

答案 4 :(得分:1)

strpos返回它首次找到$ needle的索引位置,该值可能为0.由于0也解析为false,解决方案是使用严格比较:if(false!== strpos($ haystack,$ needle) ...