【问题标题】:Difference between &function and function() in perl [duplicate]perl中&function和function()之间的区别[重复]
【发布时间】:2012-02-13 06:50:58
【问题描述】:

可能重复:
When should I use the & to call a Perl subroutine?

在 perl 脚本中,为什么调用函数的方法有时会以不同的方式编写。我看到 &function,有时还有 function()。它们是否相同,而这只是一种想要炫耀的风格?如果它们相同,为什么它们都可用,难道不是一个就足够了吗?我猜这两种方法之间存在一些语义差异,可以将它们彼此区分开来......但是在什么样的情况下?

--- 由于超时原因我无法回答自己的问题——我正在更新问题部分中的答案。当我有机会更新答案块时,我会把它放在那里。

我在“Learning Perl”一书中找到了相关文本。不过,感谢您的提示。第 4 章:子程序——省略与号。

我对 perl 函数的 & 和 & 用法更感兴趣。如果在调用之前已经定义了子例程,则可以在调用函数时不使用 & 来调用子例程,类似于调用内置函数。 & 还用于区分内置函数和用户定义函数,如果要调用的函数使用与其中一个内置函数相同的名称,前提是它在被调用之前定义。

使用 () 只是为了证明将参数传递给子例程是合理的,而如果不使用,则当前参数的默认列表以 @_ 的形式传递。如果在 () 中为子例程指定了参数,则假定它是一个子例程并被调用,即使在解析时之前没有定义。

【问题讨论】:

  • 嗨@manatwork,这解释了 &foo 和 &foo() 之间的区别,但是如果没有必要,为什么要使用 & 符号...什么时候需要?
  • 在描述部分perlsub 列举了& 何时是可选的。
  • 如果有 use strict; 杂注,则不能调用之前未定义的子例程——通常应该有。
  • 这可能属于 Stack Overflow,因为它不是 Unix 特定的。

标签: perl


【解决方案1】:

它有非常具体的用途:

  • & 告诉 Perl 忽略 sub 的原型。
  • & 可以让你使用来电者的@_。 (&foo; 没有括号或参数)。
  • goto &foo;defined &foo
  • 获取参考(例如\&foo)。

有些人(主要是初学者)用它来区分用户 subs 和内置函数,因为内置函数前面不能有 &

【讨论】:

  • 还有什么其他方法可以区分用户订阅和内置?
  • @jackthehipster,命名约定,尽管我质疑它的必要性。谁在乎谁写的。 utf8::encode 是内置函数而 Encode::encode_utf8 不是内置函数是否重要?
【解决方案2】:

正如@manatwork 和@KeithThompson 所述,您可以在这些文章中找到信息:

  1. 一般描述 - What's the difference between calling a function as &foo and foo()?
  2. 关于使用 & 或不用于函数调用的微妙信息 - perlsub: Perl Subroutines: Description

【讨论】:

  • 如果你想知道我的单字符。编辑:您的答案 rendered 使用了错误的 URL 编码 URL(即使它在 Markdown 源中是正确的),这导致“有什么区别......”的锚部分无法正常运行(一个降落在冗长的目标页面的顶部,而不是感兴趣的锚点)。我怀疑这是一个 historical Markdown 渲染错误,此后已针对 new 答案进行了修复。通过强制再次保存您的答案,问题就消失了。
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 2012-03-12
  • 2018-06-20
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多