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

Alexey Shrub worldmind на mail.ru
Пт Окт 5 01:35:05 PDT 2012


02.10.2012 14:02, Sergiy Borodych пишет:
> вот первое что пришло в голову
>
> 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 ;)

Может как-то так

use v5.10;
my @commands = qw( a b c );
my %commands = ( 'a' => sub { say 1 }, 'b' => sub { say 2 }, 'c' => sub 
{ say 3 } );
my $curr_cmd = $ARGV[0] // 'a';
my $last_cmd = $commands[$#commands];

foreach my $cmd_name ( $curr_cmd .. $last_cmd ) {
   $commands{$cmd_name}->();
}

структуру данных можно похитрее сделать чтобы избежать дублирования, но 
для демонстрации достаточно и так

По теме - goto использовал только раз когда нужно было cgi скрипт с 
глобальными переменными быстро превратить в модперлловое приложение - 
работает, но это временный костыль

-- 
Alexey Shrub


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