不知道下面两种示例在两种情况下do {}
返回列表时给出不同结果的背后的原理是什么。
perl -wE 'say my $r = do { (44); }'
44
perl -wE 'say my $r = do { my ($x) = map $_, 44; }'
1
最佳答案
在这两种情况下,给$ r的赋值都强制do上的标量上下文。但是,在第一种情况下,列表上的标量上下文会返回列表的最后一个值'44'。
在第二种情况下,对my ($x)
的赋值会强制使用列表上下文。在标量上下文中赋给列表的结果是赋值右侧的元素数量。这样你就知道了。map $_, 44
返回长度为1的列表,其中包含(44)my ($x) =
将上面列表中的结果分配给列表$x
,因为($x)
放在方括号中,使得$ x = 44
由于对do
进行了赋值,因此$r
块处于标量上下文中,请注意缺少括号,并且正如我在上面所说的,这返回了列表赋值右侧的长度。在这种情况下为1。
查看执行以下操作会发生什么:
perl -wE 'say my $r = () = (1,3,5,7)'
关于perl - 标量与列表上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54180973/