Вы выполняли неправильные тесты.Используйте caller , чтобы увидеть, что происходит.
#!/usr/bin/perl
use strict;
use warnings;
sub foo {
my $level = 0;
while (my $sub = (caller($level))[3]) {
print "$sub\n";
++$level;
}
print "\n";
}
sub bar {
print "sub:\n";
&foo;
}
sub baz {
print "goto:\n";
goto &foo;
}
bar();
baz();
Когда вы запустите его, вы увидите что-то вроде:
$ ~/stuff/goto
sub:
main::foo
main::bar
goto:
main::foo