微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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:

06001

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

但是,ikegami认为它是“result[s] in a list operator,so it is a list literal.”

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

解决方法

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

在一行中:

my $x = ...;

…看到标量上下文,所以如果…是一个列表文字,那么你将在标量上下文中有一个列表文字

my $x = (1,3);

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

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

所以基本上这是术语的区别,列表文字引用实际源代码*中逗号分隔的值列表,列表引用放在perl堆栈上的值序列.

您可以编写具有返回值的子例程,这些返回值的行为类似于数组或类似于上下文的列表文字.

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

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

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

您也可以在这里查看我的答案:How do I get the first item from a function that returns an array in Perl?,它详细介绍了列表.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐