Вот тут мне подход нравится. Каждое действие обернуть в процедуру, они для того и существуют.<div><br></div><div>Псевдокод</div><div><br></div><div>my @ACTIONS = (</div><div>  { do => \&sub, fallback => \&sub2 },</div>
<div>)</div><div><br></div><div>while (not_processed()) {</div><div>  for my $sub (@ACTIONS) {</div><div>    eval { $sub->sub(); }</div><div>   if ($@) { $sub->fallback($@); last }</div><div>  }<br>}</div><div><br></div>
<div>При желании можно в карте указывать более сложнубю логику, то тогда это уже машина состояний ближе по духу.</div><div><br><div class="gmail_quote">2 октября 2012 г., 15:02 пользователь Sergiy Borodych <span dir="ltr"><<a href="mailto:sergiy.borodych@gmail.com" target="_blank">sergiy.borodych@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">2012/10/2 oleg alexeenkov <<a href="mailto:proler@gmail.com">proler@gmail.com</a>>:<br>
<div><div class="h5">> Mons Anderson <<a href="mailto:mons@cpan.org">mons@cpan.org</a>> писал(а) в своём письме Tue, 02 Oct 2012<br>
> 11:57:21 +0400:<br>
><br>
><br>
>> 2012/10/2 Maxim Vuets <<a href="mailto:maxim.vuets@gmail.com">maxim.vuets@gmail.com</a>><br>
>><br>
>>> On Tue, Oct 02, 2012 at 07:18:21AM +0100, ksvs wrote:<br>
>>> >Недавно начал учить Perl и вот узнал, что в нем есть goto.<br>
>>> >А препод информатики говорит, что за использование goto по рукам надо<br>
>>> >бить, а языки с ним - ушербны.<br>
>>><br>
>>> Относитесь скептически к людям, которые рассуждают такими категориями.<br>
>>><br>
>>><br>
>> Поддерживаю.<br>
>><br>
>> И кстати в перле есть 3  версии goto.<br>
>><br>
>> 1. классический goto LABEL. используется крайне редко.<br>
>> 2. goto EXPR. жуткая версия goto LABEL, которая позволяет переходить на<br>
>> динамически вычисленную метку. Никогда вообще не видел, чтоб кто-то<br>
>> использовал.<br>
><br>
><br>
> Например есть скрипт, в котором живет некий процесс, состоящий из разных<br>
> долгих стадий, который должны выполняться в опредененной последовательности.<br>
> Стадии могут сломаться, и мы можем захотеть возобновить работу с середины<br>
><br>
> <a href="http://a.pl" target="_blank">a.pl</a>:<br>
> eval { goto $ARGV[0]; }<br>
> a:<br>
>         sleep 86400;<br>
> b:<br>
>         sleep 86400;<br>
> c:<br>
>         sleep 86400;<br>
> d:<br>
>         sleep 86400;<br>
> e:<br>
>         sleep 86400;<br>
><br>
> <a href="http://a.pl" target="_blank">a.pl</a> c   # - начнем с c<br>
><br>
> Интересно посмотреть на решения без goto<br>
><br>
><br>
><br>
>> 3! goto CODEREF. Прекрасная, незаменимая, функция, которой и я пользуююсь<br>
>> регулярно и встречаю таковое использование. За примером далеко ходить не<br>
>> нужно - Tail Recursion<br>
><br>
<br>
</div></div>ИМХО много ;)<br>
вот первое что пришло в голову<br>
<br>
my @comands = qw( a b c d e );<br>
# ну или<br>
#my %commands = ( a => sub { ... }, ... );<br>
<br>
my $cur_command = $ARGV[0];<br>
my $run;<br>
<br>
foreach my $command ( @comands ) {<br>
  # этот момент можно и красивей придумать ;)<br>
  $run = 1 if $command eq $cur_command;<br>
  next unless $run;<br>
<br>
  # здесь или<br>
  if ($command eq 'a') ... elsif ...<br>
  # или лучеше еще использовать dispatch table<br>
  $comands{$command}->();<br>
}<br>
<br>
<br>
Сам использую goto редко, но иногда действительно с ним легче только<br>
правда для вариантов 1 и 3 ;)<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Sergiy Borodych<br>
</font></span><div class="HOEnZb"><div class="h5">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br></div>