在标量上下文中是否存在列表?

Zai*_*aid 9 perl list scalar-context

my $mind = ( 'a', 'little', 'confused' );
Run Code Online (Sandbox Code Playgroud)

这是因为perldoc perlfaq4上面的行解释如下(强调添加):

由于您正在分配标量,因此右侧是标量上下文.标量上下文中的逗号运算符(是的,它是运算符!)评估其左侧,抛出结果,并评估它的右侧并返回结果.实际上,该 列表极为相象分配给$scalar它的右值.许多人搞砸了这一点,因为他们选择了一个类似于列表的列表,其最后一个元素也是他们期望的计数:

my $scalar = ( 1, 2, 3 );  # $scalar gets 3, accidentally
Run Code Online (Sandbox Code Playgroud)

我理解这意味着在标量上下文中没有列表这样的东西.

然而,ikegami坚持认为它是"在列表运算符中的结果[s],所以它一个列表文字."

那么,它是否是一个列表?

Eri*_*rom 8

列表文字实际上是在代码中写出的列表,因此(1, 2, 3)是列表文字,而caller例如是可以根据上下文返回列表或标量的函数.

在一行中:

my $x = ...;
Run Code Online (Sandbox Code Playgroud)

...看到标量上下文,所以如果...是一个列表文字,那么你就必须在标量上下文文字列表:

my $x = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

但是列表文字不会产生列表,因为它包含的逗号运算符会看到标量上下文,然后导致它返回列表文字的最后一项,并在评估它们之后抛弃剩余的值.

就函数而言,函数本身可以看到它被调用的任何上下文,然后它被传播到返回的函数中的任何行.因此,您可以在标量,列表或无效上下文中使用函数,如果该子集的最后一行恰好是列表文字,则该列表文字将看到任何这些上下文并且将表现得恰当.

所以基本上这是术语的区别,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]}
Run Code Online (Sandbox Code Playgroud)

*或导致逗号分隔值列表的内容,如qw()或逗号=>或散列或数组切片.

您还可以在此处查看我的答案:如何从Perl中返回数组的函数中获取第一项?有关列表的详细信息.