【问题标题】:Why does printing a list output last item in list?为什么打印列表会输出列表中的最后一项?
【发布时间】:2016-08-12 05:56:20
【问题描述】:
print "Val: " . ('a','b','c');

输出是:

c

为什么?

不管你怎么做。可能是:

sub test {
    return ('a','b','c');
}
print "Val: " . test();

【问题讨论】:

  • 您显示的代码不会发生这种情况。请显示您正在使用的有问题的实际代码。
  • 欢迎来到 perl 独一无二的精彩世界。 . 的右边需要一个标量值,因此 rhs - 一个列表 - 计算为最后一个元素“c”。
  • @JoopEggen:“欢迎来到 perl 独特的美妙世界” 请不要有部落主义。 C 和 C++ 中的逗号运算符的行为方式相同,其他语言可能也会效仿。你希望print "Val: " . ('a','b','c') 做什么?对我来说,想要什么似乎并不明显。所有三个表达式都按顺序求值,以防它们有副作用,并使用最后一个求值的值。我想不出更好的实现方式,你可以吗?
  • @JoopEggen:我现在找不到它,但我读到 Java “很难做对,也很难出错” 或类似的东西。这同样适用于 C++,并且以不同的方式适用于 C。同时,Larry Wall 引用了一句话“容易的事情应该是容易的,而困难的事情应该是可能的”。我想大概总结一下。
  • @JoopEggen re“更详细”,如果你启用警告(你应该总是这样做),它会说Useless use of a constant ("a") in void contextUseless use of a constant ("b") in void context

标签: list perl printing


【解决方案1】:

http://blogs.perl.org/users/steven_haryanto/2012/09/the-comma-operator.html

解释逗号运算符。引用他们的话,

"...它只是二进制逗号运算符。在标量上下文中,逗号运算符(逐字引用 perlop 联机帮助页)"计算其左参数,丢弃该值,然后计算其右参数并返回那个值。这就像 C 的逗号运算符。”所以最终结果是最右边的参数......”

【讨论】:

    【解决方案2】:

    连接运算符 (.) 将两个标量作为操作数,因此您的列表在标量上下文中进行评估。正如 Roderick Young 的回答中所解释的,由于逗号运算符的工作方式,列表在标量上下文中评估时会返回其最终值。

    如果您想打印列表中的所有项目,您可以在print 语句中使用, 而不是.,或者(可能更好)使用join 将列表转换为标量连接前:

    $ perl -E 'say "Val: ", ("a", "b", "c")'
    Val: abc
    ~$ perl -E 'say "Val: " . join("-", ("a", "b", "c"))'
    Val: a-b-c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2023-04-01
      • 2017-08-28
      • 2014-12-16
      • 2016-05-05
      • 2018-02-15
      相关资源
      最近更新 更多