Почему бы вам не использовать исключения? Любой случай, когда нормальный поток кода не должен соблюдаться, является исключением. Использование «return» или «goto» - это одно и то же, просто «не то, что вы хотите».
(То, что вы действительно хотите, это продолжения, которые «return», «goto», «last» и «throw» являются особыми случаями. Хотя Perl не имеет полных продолжений, у нас есть escape-продолжения; см. http://metacpan.org/pod/Continuation::Escape)
В своем примере кода вы пишете:
do
{
if(failcond)
{
last;
}
#...
};
Это, вероятно, так же, как:
eval {
if(failcond){
die 'failcond';
}
}
Если вы хотите быть хитрым и игнорировать другие исключения:
my $magic = [];
eval {
if(failcond){
die $magic;
}
}
if ($@ != $magic) {
die; # rethrow
}
Или вы можете использовать модуль Continuation :: Escape, упомянутый выше. Но
нет причин игнорировать исключения; это вполне приемлемо
использовать их таким образом.