Сколько способов вы можете вызвать подпрограмму и игнорировать ее прототип в Perl?

Мы все должны быть знакомы с проблемами, связанными с prototypes в Perl. Вот две большие команды:

  • они не работают как прототипы на других языках, поэтому люди неправильно понимают их.
  • они не применяются ко всем способам вызова подпрограммы.

Второй пункт - тот, который мне сейчас интересно.

Я знаю о двух способах обхода/обхода/игнорирования принудительного исполнения прототипа при вызове подпрограммы:

  • Вызовите sub как метод. Foo->subroutine_name();
  • Вызовите sub с ведущей & сигил. &subroutine_name();

Есть ли другие интересные случаи, которые я пропустил?

Udpate:

@brian d foy, я особенно не хочу уклоняться от прототипов, но я задавался вопросом: "Сколько способов сделать это?" Я задаю этот вопрос из любопытства.

@jrockway, я согласен с вами, и я считаю, что вы более подробно и более кратко описали мою первую мысль о проблемах с прототипами, которые люди неправильно понимают. Возможно, проблема заключается в ожиданиях программистов, а не в функции. Но это действительно философский вопрос, который я не хочу иметь.

Ответ 1

Вызовите его с помощью справки подпрограммы.

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

Вызовите его, прежде чем Perl увидит прототип (важно, потому что perl не заставляет вас объявлять субтитры перед использованием):

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

Ответ 2

Использование синтаксиса goto &name.

Ответ 3

Type-Глоб.

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

Также рассмотрим Bar- > foo(), записанный в косвенной записи:

foo Bar

Больше? давай, принеси.