【问题标题】:Perl structures and assignmentPerl 结构和赋值
【发布时间】:2012-01-25 19:50:16
【问题描述】:

在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的区别

【问题讨论】:

    标签: arrays perl scalar


    【解决方案1】:

    perldata中的例子:

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

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

    等于说:

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

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

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

    【讨论】:

    • 您从答案中复制了代码,并试图修复它。我可以说是因为您还复制了看似撇号但实际上不是撇号的内容。 U+2018 左单引号(固定)
    • @BradGilbert 是的,我想知道您编辑的是什么。然而,你是不正确的。我从问题中复制了代码,而不是答案。 =)
    • 哦,随便吧:P ...现在是晚上 11 点,我累了。
    【解决方案2】:

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

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

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

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

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

    以完全不同的方式行事。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-01
      • 2020-02-11
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2020-05-09
      相关资源
      最近更新 更多