[Moscow.pm] Запутался

Sergiy Borodych sergiy.borodych на gmail.com
Вт Окт 2 04:02:26 PDT 2012


2012/10/2 oleg alexeenkov <proler на gmail.com>:
> Mons Anderson <mons на cpan.org> писал(а) в своём письме Tue, 02 Oct 2012
> 11:57:21 +0400:
>
>
>> 2012/10/2 Maxim Vuets <maxim.vuets на gmail.com>
>>
>>> On Tue, Oct 02, 2012 at 07:18:21AM +0100, ksvs wrote:
>>> >Недавно начал учить Perl и вот узнал, что в нем есть goto.
>>> >А препод информатики говорит, что за использование goto по рукам надо
>>> >бить, а языки с ним - ушербны.
>>>
>>> Относитесь скептически к людям, которые рассуждают такими категориями.
>>>
>>>
>> Поддерживаю.
>>
>> И кстати в перле есть 3  версии goto.
>>
>> 1. классический goto LABEL. используется крайне редко.
>> 2. goto EXPR. жуткая версия goto LABEL, которая позволяет переходить на
>> динамически вычисленную метку. Никогда вообще не видел, чтоб кто-то
>> использовал.
>
>
> Например есть скрипт, в котором живет некий процесс, состоящий из разных
> долгих стадий, который должны выполняться в опредененной последовательности.
> Стадии могут сломаться, и мы можем захотеть возобновить работу с середины
>
> a.pl:
> eval { goto $ARGV[0]; }
> a:
>         sleep 86400;
> b:
>         sleep 86400;
> c:
>         sleep 86400;
> d:
>         sleep 86400;
> e:
>         sleep 86400;
>
> a.pl c   # - начнем с c
>
> Интересно посмотреть на решения без goto
>
>
>
>> 3! goto CODEREF. Прекрасная, незаменимая, функция, которой и я пользуююсь
>> регулярно и встречаю таковое использование. За примером далеко ходить не
>> нужно - Tail Recursion
>

ИМХО много ;)
вот первое что пришло в голову

my @comands = qw( a b c d e );
# ну или
#my %commands = ( a => sub { ... }, ... );

my $cur_command = $ARGV[0];
my $run;

foreach my $command ( @comands ) {
  # этот момент можно и красивей придумать ;)
  $run = 1 if $command eq $cur_command;
  next unless $run;

  # здесь или
  if ($command eq 'a') ... elsif ...
  # или лучеше еще использовать dispatch table
  $comands{$command}->();
}


Сам использую goto редко, но иногда действительно с ним легче только
правда для вариантов 1 и 3 ;)

-- 
Sergiy Borodych


Подробная информация о списке рассылки Moscow-pm