gpt4 book ai didi

perl - 标量上下文中是否存在列表之类的东西?

转载 作者:行者123 更新时间:2023-12-02 17:40:12 26 4
gpt4 key购买 nike

my $mind = ( 'a', 'little', 'confused' );
<小时/>

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

Since you're assigning to a scalar, the righthand side is in scalar context. The comma operator (yes, it's an operator!) in scalar context evaluates its lefthand side, throws away the result, and evaluates it's righthand side and returns the result. In effect, that list-lookalike assigns to $scalar it's rightmost value. Many people mess this up because they choose a list-lookalike whose last element is also the count they expect:

my $scalar = ( 1, 2, 3 );  # $scalar gets 3, accidentally

我理解这意味着标量上下文中不存在列表之类的东西。

但是,ikegami坚持认为"result[s] in a list operator, so it is a list literal."

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

最佳答案

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

在一行中:

my $x = ...;

... 看到标量上下文,因此如果 ... 是一个列表文字,那么您将在标量上下文中拥有一个列表文字:

my $x = (1, 2, 3);

但是列表文字不会生成列表,因为它包含的逗号运算符会看到标量上下文,这会导致它返回列表文字的最后一项,并在评估剩余值后将其丢弃。

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

所以基本上这是一个术语区别,列表文字指的是实际源代码*中逗号分隔的值列表,而列表指的是一系列值被放置到 Perl 的堆栈上。

您可以编写带有返回值的子例程,其行为类似于数组或与上下文相关的列表文字。

sub returns_like_array  {my @x = 1..5; return @x}

sub returns_like_list {my @x = 1..5; return @x[0 .. $#x]}

*或产生逗号分隔值列表的内容,例如 qw() 或粗逗号 => 或散列或数组切片。

您也可以在这里查看我的回答:How do I get the first item from a function that returns an array in Perl?其中更详细地介绍了列表。

关于perl - 标量上下文中是否存在列表之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8232951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com