首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在标量上下文中有列表这样的东西吗?

在标量上下文中有列表这样的东西吗?
EN

Stack Overflow用户
提问于 2011-11-22 19:57:05
回答 5查看 498关注 0票数 9
代码语言:javascript
复制
my $mind = ( 'a', 'little', 'confused' );

这是因为perldoc perlfaq4对上面的一行作了如下解释(强调是加在后面的):

由于要分配给标量,右侧是标量上下文。逗号操作符(是的,它是一个操作符!)在标量上下文中,计算其左侧,丢弃结果,并计算其右侧并返回结果。实际上,list-lookalike分配给$scalar --它是最正确的值。许多人之所以搞砸,是因为他们选择了一个list-lookalike,它的最后一个元素也是他们所期望的计数: 我的$scalar =( 1,2,3 );# $scalar不小心得到3

我的理解是,在标量上下文中,没有一个列表这样的东西。

然而,池格米坚持认为它是一个字面上的列表。“

那么,这到底是一份名单呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-22 20:22:17

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

列成一行,如:

代码语言:javascript
复制
my $x = ...;

...看到标量上下文,所以如果...是一个列表文本,那么在标量上下文中将有一个列表文本:

代码语言:javascript
复制
my $x = (1, 2, 3);

但是列表文字不会导致一个列表,因为它包含的逗号操作符会看到标量上下文,这会导致它返回列表文本的最后一项,并在计算它们之后抛出其余的值。

就函数而言,该函数本身可以看到调用它的任何上下文,然后将其传播到函数中返回的任何行。因此,您可以在标量、列表或空上下文中拥有一个函数,如果该子文件的最后一行恰好是列表文本,该列表文本将看到任何这些上下文,并将适当地运行。

因此,这基本上是一个术语上的区别,list literal指的是实际源代码*中的逗号分隔的值列表,而list是指放置在perl堆栈上的一系列值。

您可以编写带有返回值的子程序,这些子程序的行为与数组类似,也可以类似于上下文方面的列表文本。

代码语言:javascript
复制
sub returns_like_array  {my @x = 1..5; return @x}

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

*或导致逗号分隔值列表的东西,如qw()或胖逗号=>或散列或数组片。

您也可以在这里查看我的答案:如何从返回Perl数组的函数中获取第一项?,它将深入到列表的更多细节。

票数 8
EN

Stack Overflow用户

发布于 2011-11-22 20:05:14

我同意你和perlfaq4的观点。引用perldata的话,这可能是关于这一点的最终文档:

在不需要列表值的上下文中,似乎是的值--一个列表文本--只是最后一个元素的值,就像C逗号运算符一样。

(强调我的)。

也就是说,宜伽米有权使用他想要的任何术语。不同的人以不同的术语看待不同的语言结构,只要最终结果是相同的,我认为他们的术语是否与文档中的术语不同并不重要。(不过,在公共论坛上坚持使用特殊术语并不是个好主意!)

票数 3
EN

Stack Overflow用户

发布于 2011-11-22 23:03:57

问问Perl吧!

代码语言:javascript
复制
>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,就不可能编译以下内容:

代码语言:javascript
复制
sub f { "a", "b", "c" }

这会导致列表op还是逗号op?在现实中,没有这样的区别,所以是的,它的结果是这样的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8232951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档