【发布时间】:2012-01-04 04:47:38
【问题描述】:
my $mind = ( 'a', 'little', 'confused' );
这是因为perldoc perlfaq4 将上面的行解释如下(强调添加):
由于您要分配给标量,因此右侧是标量 语境。标量上下文中的逗号运算符(是的,它是一个运算符!) 评估其左侧,丢弃结果,并评估 它在右手边并返回结果。实际上,那 list-lookalike 分配给
$scalar它是最右边的值。很多人 搞砸了,因为他们选择了一个 list-lookalike,其最后一个元素 也是他们期望的计数:my $scalar = ( 1, 2, 3 ); # $scalar gets 3, accidentally
我理解这意味着在标量上下文中没有列表这样的东西。
但是,ikegami 坚持认为它是"result[s] in a list operator, so it is a list literal."
那么,它是不是一个列表?
【问题讨论】:
-
这不就是“天使在针头上跳舞”吗?如果程序员认为“
$a=('foo','bar')是在标量上下文中评估列表,它评估最右边的元素等”,后果是什么?这种错误的信念将如何再次困扰着他(除了与布赖恩·德·福伊(brian d foy)发生激烈的战争)?对于我能想到的所有其他关于 Perl 的常见“误解”,有一些简单的 sn-p 代码——经验证据——以一种或另一种方式证明一个观点。这个问题有这样的实验吗?甚至是查看内部结构或操作码? -
@mob => 如果有人认为它是标量上下文中的列表,他们可能会认为将
@a定义为qw(a b c)然后在标量上下文中的列表文字(11, 22, @a)中, list 扩展它的参数,所以它变成(11, 22, 'a', 'b', 'c'),然后它返回最后一个参数c。这当然是错误的,它返回3,即标量上下文中的@a。 -
一个代码 sn-p 可以是:
perl -E '@a = qw(a b c); sub list {@_[0..$#_]} $x = (11, @a); $y = list (11, @a); say "$x, $y"'打印3, c -
@ikegami => 请不要再这么迂腐了,这真的无助于谈话。在我的评论中,我清楚地解释了一个新手可能遇到的错误。在 perldata 中阅读此内容后可能会说:
LISTs do automatic interpolation of sublists. That is, when a LIST is evaluated, each element of the list is evaluated in list context, and the resulting list value is interpolated into LIST just as if each individual element were a member of LIST. Thus arrays and hashes lose their identity in a LIST... -
@ikegami => 当然是错的,这就是重点。如果有人不理解上下文是如何传播的,并在 perldata 中读取它怎么办?然后他们可能会得出我对 mob 的回答中所表达的结论,他要求举例说明误解。在撰写本文时,似乎至少有其他 4 人理解这一点。我猜你不是其中之一?
This is of course wrong和以下代码示例对您来说是否不够清楚? (讽刺的是,我并没有忘记讨论您似乎如何错过了此评论链中的上下文传播……)
标签: perl list scalar-context