Как перенести код Perl Switch-как оператор для использования с 5.8 - PullRequest
2 голосов
/ 27 октября 2011

У меня есть этот конкретный код, который использует 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";
                }
            }
        }
    }
}

Ответы [ 3 ]

7 голосов
/ 27 октября 2011

Достаточно просто заменить given / when с if / elsif с.

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";
            }
        }
    }
}

Но я испытываю желание переписать это как анонимные подписчики с таблицей отправки.

3 голосов
/ 27 октября 2011

Я думаю, что простого if-elsif будет достаточно для замены там кода, похожего на switch.

Коммутатор CPAN является исходным фильтром, поэтому, я думаю, он сгенерирует код, аналогичный if-elsif. И это имеет некоторые ограничения, когда вы используете его в eval: «Из-за того, что исходные фильтры работают в Perl, вы не можете использовать Switch внутри строки eval». http://perldoc.perl.org/5.8.9/Switch.html

2 голосов
/ 27 октября 2011

Мое личное предпочтение - использовать 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, если вы не хотите переходить к следующему случаю.

...