我从学习Perl,第六版获悉。 (ISBN:978-1-449-30358-7)p.58 ($x, $y) = "something", "new";
是列表上下文。那么为什么以下代码打印“蜜蜂”?请解释代码是如何解析的。
$dina = bobba;
$ba = bee;
print " " . ($dina, $ba)."\n";
答案 0 :(得分:4)
连接运算符.
在逗号运算符创建的列表上强制使用标量上下文,因此它返回其最后一个成员。
答案 1 :(得分:4)
最相关的文件引用是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.
答案 2 :(得分:2)
“($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