Можно ли упростить этот Perl-код? - PullRequest
3 голосов
/ 31 июля 2011
foreach my $f($query->param) {
    foreach my $v($query->param($f)) {
        switch($f) {
            case 'a' {
                switch($v) {
                    case 1 { code1; }
                    case 2 { code2; }
                    case 3 { code3; }
                }

            case 'b' {
                switch($v) {
                    case 1 { code4; }
                    case 2 { code5; }
                }

            case 'c' {
                switch($v) {
                    case 1 { code6; }
                    case 2 { code7; }
                    case 3 { code8; }
                    case 4 { code9; }
                }
            }
        }
    }
}

Ответы [ 3 ]

12 голосов
/ 31 июля 2011

Прежде всего ... НЕ ИСПОЛЬЗУЙТЕ Switch.pm.Если вы используете Perl 5.10 или новее, данный / когда является собственным оператором переключения.

Таблица диспетчеризации - это решение, которое вы ищете.http://www.perlmonks.org/?node_id=587072 описывает таблицы диспетчеризации, метод для выполнения кода через хеш, основанный на некотором значении, соответствующем хеш-ключу.

Редактировать, пример:

my %dispatch_table = (
    'a' => {
        '1' => sub { code1; },
        '2' => sub { code2; },
        '3' => sub { code3; },
    'b' => {
        '1' => \&some_sub,
        '2' => sub { code4; },
    }
)

if ( exists( $dispatch_table{$f} ) and exists( $dispatch_table{$f}{$v} ) ) {
    $dispatch_table{$f}{$v}->();
}
else {
    # some default
}
3 голосов
/ 01 августа 2011

Поместите его в «таблицу отправки»:

my %code = (
    a => {
        1 => sub { code1 },
        2 => sub { code2 },
        3 => sub { code3 },
    },
    b => {
        1 => sub { code4 },
        2 => sub { code5 },
    },
    c => {
        1 => sub { code6 },
        2 => sub { code7 },
        3 => sub { code8 },
        4 => sub { code9 },
    },
);

Затем, получив $ f и $ v, вызовите правильную подпрограмму:

$code{$f}{$v}->();
1 голос
/ 31 июля 2011

В зависимости от того, что вы подразумеваете под «упрощенным», вы можете рассмотреть что-то вроде этого (если вы уверены, что ни $ f, ни $ v не могут содержать ','):

foreach my $f ($query->param) {
    foreach my $v ($query->param($f)) {
        switch ("$f,$v") {
            case "a,1" { code; }
            case "a,2" { code; }
            case "a,3" { code; }

            case "b,1" { code; }
            case "b,2" { code; }

            case "c,1" { code; }
            case "c,2" { code; }
            case "c,3" { code; }
            case "c,4" { code; }
        }
    }   
}

(Я предполагаю, что все вхождения code; на самом деле разные.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...