2

在 perldata 中,我找到了以下示例和解释。

@foo = ('cc', '-E', $bar);

assigns the entire list value to array @foo, but

$foo = ('cc', '-E', $bar);

assigns the value of variable $bar to the scalar variable $foo. 

这真的让我很困惑,所以$foo相当于$bar@foo如何理解和之间的区别$foo

4

2 回答 2

6

perldata中的示例:

@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);

因为@foo创建了一个列表上下文,所以括号中的所有值都分配给@foo. $foo另一方面是一个标量,因此只分配列表中的最后一个元素,因为它是在标量上下文中。

等于说:

'cc', '-E';
$foo = $bar;

在 Perl 中,像 一样的标量$foo只能保存一个值,因此列表的其余部分被简单地丢弃。一个数组,就像@foo列表中所包含的一样多的值。

在 Perl 中,允许在不同类型的变量上使用相同的名称。@foo并将$foo被视为两个不同的变量。

于 2011-12-22T04:18:31.527 回答
3

表达式可以具有不同的含义,具体取决于它们在哪个上下文中进行评估。三个主要上下文是列表、标量和 void,尽管存在标量上下文的几个子上下文(布尔值、字符串和数字是最重要的) .

逗号运算符也不例外。在列表上下文中,逗号运算符充当列表连接运算符,在列表上下文中评估其操作数并将结果列表组合成一个列表。这可能是您在处理逗号运算符时熟悉的上下文。

然而,在标量上下文中,逗号运算符的功能与 C 中的逗号运算符很相似。它计算一系列表达式并丢弃它们的结果,除了它返回的最右边的表达式(作为旁注,被丢弃的表达式在 void 上下文中计算,返回的表达式在标量上下文中计算)。要了解每个 perl 运算符在不同上下文中的行为方式,我建议阅读perlop

为了完全理解上下文,您必须意识到最外层的运算符对其操作数强制执行上下文,然后其运算符对其操作数强制执行上下文,依此类推(另一个注解:行的最外层表达式始终在无效上下文)。因此,例如,当赋值运算符与数组或散列变量(以 % 或 @ 开头)一起使用时,赋值的右侧因此在列表上下文中进行评估。但是,如果变量是标量,则赋值的右侧将在标量上下文中进行评估。这就是为什么在下面的赋值中使用逗号运算符:

@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);

以完全不同的方式行事。

有关如何编写控制或响应上下文的代码的更多信息,请阅读有关标量和wantarray 运算符的信息。

于 2011-12-22T11:47:09.860 回答