在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
答案 0 :(得分:6)
perldata中的示例:
@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);
因为@foo
创建了一个列表上下文,所以parens中的所有值都分配给@foo
。另一方面,$foo
是标量,因此只分配列表中的最后一个元素,因为它位于标量上下文中。
等于说:
'cc', '-E';
$foo = $bar;
在Perl中,标量(如$foo
)只能保存一个值,因此列表的其余部分将被丢弃。像@foo
这样的数组会像列表一样包含多个值。
在Perl中,允许在不同类型的变量上使用相同的名称。 @foo
和$foo
将被视为两个不同的变量。
答案 1 :(得分:3)
表达式允许具有不同的含义,具体取决于它们被评估的上下文。三个主要的上下文是list,scalar和void,尽管存在几个标量上下文的子上下文(boolean,string和numeric是最多的)重要的)。
逗号运算符也不例外。在列表上下文中,逗号运算符充当列表并置运算符,在列表上下文中评估其操作数并将结果列表组合到单个列表中。这可能是您在处理逗号运算符时熟悉的上下文。
但是,在标量上下文中,逗号运算符的功能与C中的逗号运算符非常相似;它会计算一系列表达式并丢弃它们的结果,除了它返回的最右边的表达式(作为旁注,在void上下文中计算被丢弃的表达式,并在标量上下文中计算返回的表达式)。要了解每个perl运算符在不同上下文中的行为方式,我建议您阅读perlop。
为了完全理解上下文,你必须意识到最外层的操作符在其操作数上强制执行上下文,然后操作符对其操作数强制执行上下文,等等(另一方面注意:行的最外层表达式是总是在void上下文中评估)。因此,例如,当赋值运算符与数组或哈希变量(以%或@开头)一起使用时,赋值的右侧因此在列表上下文中进行求值。但是,如果变量是标量,则在标量上下文中评估赋值的右侧。这就是下面作业中逗号运算符的原因:
@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);
以完全不同的方式行事。
有关如何编写控制或响应上下文的代码的更多信息,请阅读标量和wantarray运算符。