2011-04-11 188 views
2

我有这样的代码这个if语句有什么问题?

​​

,其中第一if语句来工作,但第二个没有。

第二个有什么问题?

是否可以不重复变量两次?

+11

通过提供以下两条信息,可以大大提高每一个“这不起作用”形式的问题:(1)你希望它做什么? )它做了什么呢? – 2011-04-11 08:58:28

回答

5

由于第一品牌(潜在的)两个比较,先比较$nis$grp和,如果失败,比较'pre-'.$nis$grp,而第二个将只进行单次比较,$nis || 'pre-'.$nis$grp

您的问题是$nis || 'pre-'.$nis不是quantum superposition可以取决于你如何看待它取任一值,则可能是$nis'pre-'.$nis值。如果$nis是真的(也就是说,它不是空字符串,undef,数字0或字符串“0”),那么该值将是$nis。如果不是,则该值将是'pre-'.$nis(考虑到真实性规则,这意味着'pre-'.$nis将仅为'pre-''pre-0')。

如果你想以比较两个值,一般需要做两次比较...但你可以通过让你测试对正则表达式的值做特定的比较在一个步骤:

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

但是,为了可读性,我会坚持与您的第一次比较。

+0

@daxim:你读了我的想法......有一次,我已经包含了一个链接到Q :: S自己,但改变了我的想法去除它,因为它似乎非常多“不适合生产使用”的模块,所以我会觉得我必须也包含使用更多的链接/例子“严重”的设置处理模块。 – 2011-04-11 12:03:45

+0

+1参考量子叠加 – chepner 2012-07-24 13:35:31

1

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

4

有什么问题是“(A或B)等于C “和”(A等于C)或(B等于C)“意味着完全不同的东西。在你的第二个if中,你已经让Perl首先计算$nis || 'pre-'.$nis,然后看它是否等于$grp

计算$nis || 'pre-'.$nis(有点)将$nis'pre-'.$nis视为布尔(真/假)值。更准确地说,如果这不是Perl认为“false”的值,那么结果等于$nis;否则它等于'pre-'.$nis。在这种情况下,"qqq"不是错误的,所以值只是"qqq"。由于这不等于$grp,因此第二个if中的条件为false。用普通的语言,如果你说“3或6是素数”或者“乔或鲍勃是爱伦的兄弟”,人类听众会以我想你的第二个if的解释方式来解释。但这不是我知道的任何计算机语言的作品。 (半例外:Grisworld的“图标”)

2
​​

或(pre-5.10。1)

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

我会写grep解决方案为'if(grep {$ _eq $ grp}($ nis,“pre $ nis”))',这更清晰,IMO。 – mscha 2011-04-11 09:50:21

1

strpos返回在第一次发现了$针,它可以是0。由于0也解析为false的解决方案是使用严格比较的索引位置:如果(假== strpos( $ haystack,$ needle)...