my $mind = ( 'a', 'little', 'confused' );这是因为perldoc perlfaq4对上面的一行作了如下解释(强调是加在后面的):
由于要分配给标量,右侧是标量上下文。逗号操作符(是的,它是一个操作符!)在标量上下文中,计算其左侧,丢弃结果,并计算其右侧并返回结果。实际上,list-lookalike分配给
$scalar--它是最正确的值。许多人之所以搞砸,是因为他们选择了一个list-lookalike,它的最后一个元素也是他们所期望的计数: 我的$scalar =( 1,2,3 );# $scalar不小心得到3
我的理解是,在标量上下文中,没有一个列表这样的东西。
然而,池格米坚持认为它是一个字面上的列表。“
那么,这到底是一份名单呢?
发布于 2011-11-22 20:22:17
列表文字实际上是一个用代码写出的列表,所以(1, 2, 3)是一个列表文本,而caller是一个可以根据上下文返回列表或标量的函数。
列成一行,如:
my $x = ...;...看到标量上下文,所以如果...是一个列表文本,那么在标量上下文中将有一个列表文本:
my $x = (1, 2, 3);但是列表文字不会导致一个列表,因为它包含的逗号操作符会看到标量上下文,这会导致它返回列表文本的最后一项,并在计算它们之后抛出其余的值。
就函数而言,该函数本身可以看到调用它的任何上下文,然后将其传播到函数中返回的任何行。因此,您可以在标量、列表或空上下文中拥有一个函数,如果该子文件的最后一行恰好是列表文本,该列表文本将看到任何这些上下文,并将适当地运行。
因此,这基本上是一个术语上的区别,list literal指的是实际源代码*中的逗号分隔的值列表,而list是指放置在perl堆栈上的一系列值。
您可以编写带有返回值的子程序,这些子程序的行为与数组类似,也可以类似于上下文方面的列表文本。
sub returns_like_array {my @x = 1..5; return @x}
sub returns_like_list {my @x = 1..5; return @x[0 .. $#x]}*或导致逗号分隔值列表的东西,如qw()或胖逗号=>或散列或数组片。
您也可以在这里查看我的答案:如何从返回Perl数组的函数中获取第一项?,它将深入到列表的更多细节。
发布于 2011-11-22 20:05:14
我同意你和perlfaq4的观点。引用perldata的话,这可能是关于这一点的最终文档:
在不需要列表值的上下文中,似乎是的值--一个列表文本--只是最后一个元素的值,就像C逗号运算符一样。
(强调我的)。
也就是说,宜伽米有权使用他想要的任何术语。不同的人以不同的术语看待不同的语言结构,只要最终结果是相同的,我认为他们的术语是否与文档中的术语不同并不重要。(不过,在公共论坛上坚持使用特殊术语并不是个好主意!)
发布于 2011-11-22 23:03:57
问问Perl吧!
>perl -MO=Concise,-exec -e"my $s = ($x, $y, $z);"
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <0> pushmark v
4 <#> gvsv[*x] s
5 <#> gvsv[*y] s
6 <#> gvsv[*z] s
7 <@> list sKP <--- list in (s)calar context.
8 <0> padsv[$s:1,2] sRM*/LVINTRO
9 <2> sassign vKS/2
a <@> leave[1 ref] vKP/REFC所以是的,我们可以在标量上下文中有一个列表。
不能返回标量上下文中的列表。(好吧,XS是有可能的,但是程序会崩溃,可能会出现“奇怪的复制”错误。)
不可能有别的办法。如果有一个不同的列表op和逗号op,就不可能编译以下内容:
sub f { "a", "b", "c" }这会导致列表op还是逗号op?在现实中,没有这样的区别,所以是的,它的结果是这样的。
https://stackoverflow.com/questions/8232951
复制相似问题