在标量上下文中使用列表时,将返回最后一个元素:
@l = qw/ a b c d /;
print scalar ( 1, @l ); # prints 4
Run Code Online (Sandbox Code Playgroud)
列表的最后一个元素是@l
,它在标量上下文中的长度是4
所以最后一个元素是@l
.
为什么当我切片时我没有得到这个元素?
print (( 1, @l )[1]); # prints 'a'. expect: abcd
Run Code Online (Sandbox Code Playgroud)
PS.也许我应该问:为什么在第一个例子中没有发生扁平化?
这是因为在列表和标量上下文,这一事实之间的行为差异的scalar
是运营商,而不是一个子程序调用.scalar
只能使用一个操作数,因此如果传递多个参数,则将它们放入标量上下文中.这与普通的子程序调用不同,其中参数始终在列表上下文中.
在标量上下文中,逗号运算符计算并丢弃其左侧操作数,然后计算其右侧操作数.因此scalar(1, @l)
评估并丢弃1
然后进行评估@l
.如你所说,那是4因为@l
有四个元素
不出所料,列表切片强加了列表上下文,并且在列表上下文中,逗号分隔列表的元素,并且数组和散列被展平.所以(1, @l)[1]
是一样的(1, qw/ a b c d /)[1]
是a
Perl数组运算符喜欢push
并pop
以类似的方式运行.push @l, 1
如果它的行为方式与普通子程序相同并扩展为push 'a', 'b', 'c', 'd', 1
归档时间: |
|
查看次数: |
70 次 |
最近记录: |