[Moscow.pm] Запутался
Konstantin S. Uvarin
khedin на gmail.com
Ср Окт 3 01:07:04 PDT 2012
Приветствую!
> вообще goto очень удобен в случаях когда идет последовательная
> инициализация (выделение) ресурсов и в случае если надо сделать откат:
>
> sub init() {
> unless (do_something1) { goto rollback_something1 }
> unless (do_something2) { goto rollback_something2 }
> unless (do_something3) { goto rollback_something3 }
> unless (do_something4) { goto rollback_something4 }
> return;
>
> rollback_something4:
> rollback_something4();
> rollback_something3:
> rollback_something3();
> rollback_something2:
> rollback_something2();
> rollback_something1:
> rollback_something1();
> }
Интересно, а есть модуль для этого? Типа
my $stack = Roll::Back->new (rethrow => 0);
$stack->push( init => \&do_something1, rollback => \&rollback_something1 );
# ....
$stack->commit;
М.б. ещё commit => sub { ... } - типа, когда _все_ выполнено.
Если в каком-то из init'ов (или commit'ов) die - соответственно, $stack-
>rollback и все в обратном порядке.
Я пытался такое писать пару лет назад, и оно даже работало, но может уже есть
готовый модуль?
--
WBR,
Konstantin S. Uvarin
Подробная информация о списке рассылки Moscow-pm