[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