我从《Learning Perl》第 6 版了解到。(ISBN: 978-1-449-30358-7) p.58($x, $y) = "something", "new";
是一个列表上下文。那么为什么下面的代码会打印“bee”呢?请解释代码是如何解析的。
$dina = bobba;
$ba = bee;
print " " . ($dina, $ba)."\n";
我从《Learning Perl》第 6 版了解到。(ISBN: 978-1-449-30358-7) p.58($x, $y) = "something", "new";
是一个列表上下文。那么为什么下面的代码会打印“bee”呢?请解释代码是如何解析的。
$dina = bobba;
$ba = bee;
print " " . ($dina, $ba)."\n";
连接运算符.
将标量上下文强加到由逗号运算符创建的列表上,因此它返回其最后一个成员。
最相关的文档引用是 perlop(1) 中的这段:
Comma Operator
Binary "," is the comma operator. In scalar context it evaluates its
left argument, throws that value away, then evaluates its right
argument and returns that value. This is just like C's comma operator.
"($x, $y) = ("something", "new");
是一个列表上下文。" 没有意义。(添加了缺少的括号以避免偏离主题。)
首先,在列表上下文中评估某些内容。
其次,无法知道根据您发布的内容将在哪个上下文中评估该表达式,但很可能在void上下文中评估它。
您可能指的是子表达式($x, $y)
和("something", "new")
。它们确实在列表上下文中进行评估,这是因为列表赋值运算符在列表上下文中评估其操作数。
在您的代码中,($x, $y)
是连接运算符 ( .
) 的操作数。连接运算符组合了两个字符串,因此它期望字符串作为操作数。字符串是标量,连接运算符在标量上下文中评估其操作数。
在标量上下文中,
$x, $y
与
do { $x; $y }
(没有额外的范围)。列表的每个项目在 void 或标量上下文中依次评估,并且整体评估列表中最后一项返回的内容。
>perl -E"sub f { say 'f'; 3 } sub g { say 'g'; 4 } say ':'.(f,g);"
f
g
:4