这个perl代码可以简化吗?

Lem*_*m0n 3 perl

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; }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mik*_*grb 12

最重要的是......不要使用Switch.pm.如果您使用的是Perl 5.10或更高版本,则给定/ when是本机switch语句.

调度表是您寻求的解决方案. 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
}
Run Code Online (Sandbox Code Playgroud)