标量与列表上下文

Сух*_*й27 6 perl

想知道在两种情况下do {}返回列表时,遵循两个示例给出不同结果的原因是什么.

perl -wE 'say my $r = do {  (44); }'
44

perl -wE 'say my $r = do {  my ($x) = map $_, 44; }'
1
Run Code Online (Sandbox Code Playgroud)

JGN*_*GNI 7

在这两种情况下,$ r的赋值都强制执行标量上下文.但是在第一种情况下,列表上的标量上下文返回列表的最后一个值"44".

在第二个实例中my ($x)强制列表上下文的赋值,在标量上下文中分配给列表的结果是赋值右侧的元素数.所以你得到了.

map $_, 44 返回长度为1的列表,包含(44)

my ($x) =将上面的结果分配给列表上下文,因为括号围绕着$ x = 44 $x的列表($x)

do块在标量上下文中因为赋值$r,请注意缺少括号,如上所述,这将返回列表赋值右侧的长度.在这种情况下为1.

看看如果你这样做会发生什么:

perl -wE 'say my $r = () = (1,3,5,7)'
Run Code Online (Sandbox Code Playgroud)

  • 并非所有标量上下文都是平等的.:-)`我的$ r =()=(1,3,5,7)`vs`我的$ r =(1,3,5,7)` (2认同)

ike*_*ami 5

首先,两者都不do返回列表.它们在标量上下文中进行评估,因此它们必须返回单个标量,而不是任意数量的标量("列表").

在第一种情况下,do返回44标量上下文中的计算结果.这回来了44.

scalar(    44    ) ? 44
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,do返回在标量上下文中评估列表赋值的结果.这将返回赋值右侧返回的元素数.

scalar(    () = 44    ) ? 1
Run Code Online (Sandbox Code Playgroud)

我相信您混淆的真正原因是您不了解赋值运算符以及它们如何受上下文影响.如果是这样,请参阅Scalar vs List Assignment Operator以获得真实问题的答案.