代码之家  ›  专栏  ›  技术社区  ›  daotoad

有多少种方法可以调用子例程并忽略它在Perl中的原型?

  •  11
  • daotoad  · 技术社区  · 16 年前

    我们都应该熟悉与 prototypes 在Perl。以下是两个大问题:

    • 它们不像其他语言中的原型那样工作,所以人们误解了它们。
    • 它们不适用于调用子例程的所有方法。

    第二件事是我现在很好奇的那件事。

    在调用子例程时,我知道两种方法来颠覆/解决/忽略原型强制:

    • 将Sub作为方法调用。 Foo->subroutine_name();
    • 用一个前导给潜艇打电话 & 信号。 &subroutine_name();

    还有什么我错过的有趣的案子吗?

    Udpate:

    @布莱恩德福伊,我不想特别回避原型,但我想知道“有多少方法可以做到这一点?”我好奇地问这个问题。

    @Jrockway,我同意你的观点,我相信你已经更明确、更简洁地描述了我关于原型问题的第一点,人们误解了它们。也许问题在于程序员的期望,而不是特性。但这确实是一个我不想问的哲学问题。

    3 回复  |  直到 16 年前
        1
  •  11
  •   derobert    16 年前

    通过子例程引用调用它。

    sub foo($) { print "arg is $_[0]\n" }
    my $sub = \&foo;
    $sub->();
    

    在Perl看到原型之前调用它(重要的是Perl不会让您在使用前声明Sub):

    foo();
    sub foo($) { print "arg is $_[0]\n" }
    
        2
  •  3
  •   Eric Strom    16 年前

    使用 goto &name 语法。

        3
  •  3
  •   user166390    16 年前

    类型球。

    sub foo($) { print "arg is $_[0]\n" }
    *foo{CODE}()
    

    另外,考虑用间接符号重写bar->foo():

    foo Bar
    

    再?来吧,拿过来。