【问题标题】:How does comma separated operations work in perl?逗号分隔的操作如何在 perl 中工作?
【发布时间】:2011-06-17 01:02:51
【问题描述】:

我目前正在学习 Perl 编程,遇到这样的语句:

return bless { }, $type;

我知道return bless { }; 会做什么,我也知道return $type; 会做什么,但是用逗号分隔它们会如何影响语句,并且它对所有一元运算符的工作方式都相同吗?

【问题讨论】:

  • bless 有两个变体:bless REF,CLASSNAMEbless REF。显示的符号等同于return bless(REF,CLASSNAME);

标签: perl reference bless


【解决方案1】:

bless 不是一元运算符,所以会发生$type 被传递给bless (它被用作将hashref 祝福到的类的名称)。

return 的唯一特别之处在于,它右侧的表达式可能会在列表、标量或 void 上下文中计算,具体取决于调用子例程的上下文。

comma operatorreturn 语句中的解释与在其他任何地方没有任何不同(除了您无法通过查看return 语句来判断它是在列表还是标量上下文中)。

【讨论】:

  • 所以在 perl 中所有的逗号都是列表中的单独元素?
  • @chustar,“在标量上下文中,它计算左参数,丢弃该值,然后计算右参数并返回该值。”在列表上下文中,它只是分隔列表中的项目。
【解决方案2】:

可以使用或不使用括号来调用预定义的 Perl 函数。大多数来自其他语言的人将这些功能与关键字/运算符混淆。

bless、undef、push、pop、shift、unshift、print、split、join等都是函数。

因此,这两者是等价的:

 return bless { }, $type;
 return bless({ }, $type);

但这两个不是:

 print 2 * 3 + 2; # prints 8
 print(2 * 3) + 2; # prints 6 (with a warning if warnings pragma is on)

【讨论】:

  • 已声明 Perl 函数可以带或不带括号调用。内置在这方面并不特别。
  • 你说得对,子 {}; 1,2;工作,但 1, 2; sub a{} 没有。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 2018-11-13
  • 2019-02-07
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多