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

时间:2009-09-28 07:49:45

标签: perl

我们都应该熟悉Perl中与prototypes相关的问题。以下是两位大人物:

  • 他们不像其他语言的原型一样工作,所以人们会误解他们。
  • 它们不适用于调用子程序的所有方式。

第二项是我现在很好奇的一项。

我知道有两种方法可以在调用子程序时颠覆/解决/忽略原型强制执行:

  • 将sub调用为方法。 Foo->subroutine_name();
  • 使用前导& sigil调用sub。 &subroutine_name();

我错过了其他有趣的案例吗?

UDPATE:

@brian d foy,我并不特别想逃避原型,但我想知道“有多少种方法可以做到这一点?”出于好奇,我问这个问题。

@jrockway,我同意你的看法,我相信你有更明确,更简洁地描述了关于原型问题的第一点,人们会误解它们。也许问题在于程序员的期望,而不在于功能。但这确实是一个我不想要的哲学问题。

3 个答案:

答案 0 :(得分:12)

通过子程序参考来调用它。

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

在Perl看到原型之前调用它(很重要,因为perl在使用前不会让你声明sub):

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

答案 1 :(得分:3)

使用goto &name语法。

答案 2 :(得分:3)

型水珠。

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

另外,考虑用间接表示法重写Bar-> foo():

foo Bar

还有吗?来吧,带上它。