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

Akzhan Abdulin akzhan.abdulin на gmail.com
Вт Окт 2 09:44:09 PDT 2012


Вот тут мне подход нравится. Каждое действие обернуть в процедуру, они для
того и существуют.

Псевдокод

my @ACTIONS = (
  { do => \&sub, fallback => \&sub2 },
)

while (not_processed()) {
  for my $sub (@ACTIONS) {
    eval { $sub->sub(); }
   if ($@) { $sub->fallback($@); last }
  }
}

При желании можно в карте указывать более сложнубю логику, то тогда это уже
машина состояний ближе по духу.

2 октября 2012 г., 15:02 пользователь Sergiy Borodych <
sergiy.borodych на gmail.com> написал:

> 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20121002/5e42cf6f/attachment-0001.html>


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