2010-11-03 72 views
0

为什么下面的代码返回11: - @myarray =(“Rohan”);perl中的数组操作

我得到的解释是: - 表达式$ scalar x $ num_times,另一方面,返回一个字符串,其中包含$ sc_lar连接在一起的$ num_times副本。 所以应该给10不11 ...
代码如下: -

print "test:\n"; 
@myarray = ("Rohan"); # this returns 11 
##@myarray = ("Rohan","G"); this returns 22 
@myarray2 = (@myarray x 2); 
@myarray3 = ((@myarray) x 2); #returns Rohan,Rohan and is correct 

print join(",",@myarray2,"\n\n"); 
print join(",",@myarray3,"\n\n"); 

回答

4

发生了什么事是,x运营商供应标量上下文不仅仅是其右边的操作数,但其左侧和操作,以及 - 除非的LHO由文字括号包围。

这条规则是由于当Perl不理解拥有一个列表作为LHO时,从后面向后兼容超古老的Perl代码。这可能是v1 vs v2,v2 vs v3,或者v3 vs v4。不太记得;不过,很久以前它是一个。古代遗产。

由于N中标量环境中的N个元素的数组,因此在您的场景中使得N == 1"1" x 2 eq "11"

+0

谢谢特克里斯特 - 我只是想出了当埃里克评论有关标量上下文 - 我评论上面 - 但谢谢你的明确解释。这个论坛岩石 – rgolwalkar 2010-11-03 15:16:13

+0

我更喜欢解释为()x是一个不同于x的运算符(至少在列表上下文中)。不仅LHO的背景发生变化,操作也完全不同(字符串重复与列表重复)。不幸的是,他们最近使得前面的语法错误“qw // x”像()x(用于任意分隔符)一样工作,这使得这是一个更加尴尬的事情来解释。 – ysth 2010-11-03 16:13:06

+0

非常感谢你的解释 – rgolwalkar 2010-11-03 20:39:06

4

Perl是做你问什么。在第一个示例中,该数组处于标量上下文中并返回其长度。然后将其与自身连接两次。在第二个示例中,您有列表上下文中的数组,并且x运算符重复列表。

+0

Eric,对不起,我感到困惑 - 标量上下文将是一个字符串,将返回5 - 我做了@myarray x 2 - 所以答案应该是10 - 如果我错了,我很抱歉 - 请你解释一下? – rgolwalkar 2010-11-03 15:09:55

+0

嘿埃里克 - 我知道了 - 在标量环境下它会计算单个字符串多数民众赞成1和我的回答是11这是正确的 - 对不起,谢谢 – rgolwalkar 2010-11-03 15:13:30