2

我有这个使用 perl 5.10 的特定代码(用于类似开关的操作),但需要让它在 5.8 上工作。为 5.8 编写这个的另一种方法是什么?首选方式/技术?

for my $detail ($Details1, $Details2) {
    for (keys %$detail) {
        when ('file') {
            print " File: $detail->{file}{path}\n";
            print "Bytes: $detail->{file}{size}\n";
        }

        when ('directory') {
            given (ref $result->{directory}) {
                when ('ARRAY') {
                    for my $entry (@{$detail->{directory}}) {
                        print "Directory: $entry->{path}\n";
                    }
                }
                when ('HASH') {
                    print "Directory: $detail->{directory}{path}\n";
                }
            }
        }
    }
}
4

3 回答 3

7

只需将given/ whens替换为if/ elsifs 就足够简单了。

for my $detail ( $Details1, $Details2 ) {

    for ( keys %$detail ) {

        if ( $_ eq 'file' ) {

            print " File: $detail->{file}{path}\n";
            print "Bytes: $detail->{file}{size}\n";
        }

        elsif ( $_ eq 'directory' ) {

            if ( ref $result->{directory} eq 'ARRAY' ) {

                for my $entry ( @{$detail->{directory}} ) {
                    print "Directory: $entry->{path}\n";
                }
            }

            if ( ref $result->{directory} eq 'HASH' ) {
                print "Directory: $detail->{directory}{path}\n";
            }
        }
    }
}

但我很想用调度表将其重写为匿名潜艇。

于 2011-10-27T16:54:26.527 回答
3

我认为简单的 if-elsif 就足以替换那里的类似开关的代码。

CPAN Switch 是一个源过滤器,因此我猜它会生成与 if-elsif 类似的代码。当你在 eval 中使用它时它有一些限制:“由于源过滤器在 Perl 中的工作方式,你不能在字符串 eval 中使用 Switch。” http://perldoc.perl.org/5.8.9/Switch.html

于 2011-10-27T16:06:58.773 回答
2

我个人的偏好是使用for、正则表达式和do块:

for my $detail ($Details1, $Details2) {
    for (keys %$detail) {

        /^file$/ && do {
            print " File: $detail->{file}{path}\n";
            print "Bytes: $detail->{file}{size}\n";
        };

        /^directory$/ && do {

            for (ref $result->{directory}) {

                /^ARRAY$/ && do {
                    for my $entry (@{$detail->{directory}}) {
                        print "Directory: $entry->{path}\n";
                    }
                };

                /^HASH$/ && do {
                    print "Directory: $detail->{directory}{path}\n";
                };
            }
        };
    }
}

不要忘记;每个do块之后。

编辑:不要忘记使用next,或者last如果你不想陷入下一个案例。

于 2011-10-27T18:28:39.867 回答