Я думаю, что это неправильный вопрос.
Форма fun($val)
- это стандартный способ вызова другой подпрограммы в perl.
Форма goto &func
обычно используется для передачи управления другому подчиненному при удалении текущего кадра стека. Кроме того, @_
передается без изменений в вызываемую подпрограмму.
Удаление кадра стека означает, что caller()
не увидит его, поэтому &func
будет думать, что t вызвал вызывающий подпрограммы, которая выполнила goto
. Это также означает, что выполнение обратной трассировки в отладчике не будет показывать процедуру, выполняющую goto
.
Если вы хотите сохранить кадр вызывающего стека, но передать управление функции с текущей настройкой @_
, используйте return &func
.
Форма goto &func($val)
анализируется как:
my $label = &func($val);
goto $label;
Вероятно, это приведет к ошибке Can't find label ...
.
Примеры:
sub func {
my $x = shift;
print "x = $x\n";
my ($package, $file, $line) = caller();
print "caller file: $file, line: $line\n";
}
sub foo {
goto &func("from goto bar");
}
sub baz {
return &func;
}
sub quux {
goto &func;
}
baz("from baz");
quux("from quux");
foo("from foo");