表达式可以具有不同的含义,具体取决于它们在哪个上下文中进行评估。三个主要上下文是列表、标量和 void,尽管存在标量上下文的几个子上下文(布尔值、字符串和数字是最重要的) .
逗号运算符也不例外。在列表上下文中,逗号运算符充当列表连接运算符,在列表上下文中评估其操作数并将结果列表组合成一个列表。这可能是您在处理逗号运算符时熟悉的上下文。
然而,在标量上下文中,逗号运算符的功能与 C 中的逗号运算符很相似。它计算一系列表达式并丢弃它们的结果,除了它返回的最右边的表达式(作为旁注,被丢弃的表达式在 void 上下文中计算,返回的表达式在标量上下文中计算)。要了解每个 perl 运算符在不同上下文中的行为方式,我建议阅读perlop。
为了完全理解上下文,您必须意识到最外层的运算符对其操作数强制执行上下文,然后其运算符对其操作数强制执行上下文,依此类推(另一个注解:行的最外层表达式始终在无效上下文)。因此,例如,当赋值运算符与数组或散列变量(以 % 或 @ 开头)一起使用时,赋值的右侧因此在列表上下文中进行评估。但是,如果变量是标量,则赋值的右侧将在标量上下文中进行评估。这就是为什么在下面的赋值中使用逗号运算符:
@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);
以完全不同的方式行事。
有关如何编写控制或响应上下文的代码的更多信息,请阅读有关标量和wantarray 运算符的信息。