2011-04-04 88 views
3

这做什么,我会就喜欢这段代码做了什么?

if (grep {/$dn/} @ad_sys) { 
    $is_system = 1; 
} 

但这总是返回1

if (grep $_ == $dn, @ad_sys) { 
    $is_system = 1; 
} 

第二块做什么?

+0

如果您给出$ dn和@ad_sys的值,这可能很有帮助。 – Ingo 2011-04-04 13:12:27

回答

5

==用于数字比较,如果需要字符串比较使用eq

+2

为上下文扩展:在Perl中,任何字符串都可以隐式转换为数字。如果字符串以一个数字开始,那么数字就是结果,否则结果为0.所以像''foo'=='bar''这样的比较与'0 == 0'是一样的。如果你使用warings;'你会得到像'Argument'bar'这样的警告在数字eq(==)中不是数字,让你知道哪里出了问题。 – 2011-04-04 15:17:36

4

它过滤了列表@ad_sys中的那些元素,这些元素的数值为等于$ dn。 然后,如果结果不为空,则条件为真,并输入if块。

3

这两段代码有两点区别。

首先,正如其他人已经指出的那样,存在数值比较运算符的问题。

但其次,/ $ dn /检查$ _是否包含$ dn中的数据。 $ _ eq $ dn检查$ _是否等于$ dn。

这种差异可能会导致问题,例如,如果您的数据由从尚未被删除的文件中读取的行构成,以删除换行符。