为什么从列表中切片元素不返回列表?

Eug*_*kov 3 perl list

在标量上下文中使用列表时,将返回最后一个元素:

@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.也许我应该问:为什么在第一个例子中没有发生扁平化?

Bor*_*din 6

这是因为在列表和标量上下文,这一事实之间的行为差异的scalar运营商,而不是一个子程序调用.scalar只能使用一个操作数,因此如果传递多个参数,则将它们放入标量上下文中.这与普通的子程序调用不同,其中参数始终在列表上下文中.

标量上下文中,逗号运算符计算并丢弃其左侧操作数,然后计算其右侧操作数.因此scalar(1, @l)评估并丢弃1然后进行评估@l.如你所说,那是4因为@l有四个元素

不出所料,列表切片强加了列表上下文,并且在列表上下文中,逗号分隔列表的元素,并且数组和散列被展平.所以(1, @l)[1]是一样的(1, qw/ a b c d /)[1]a

Perl数组运算符喜欢pushpop以类似的方式运行.push @l, 1如果它的行为方式与普通子程序相同并扩展为push 'a', 'b', 'c', 'd', 1