5.8で使用するためのコードperl switch-like文を移植する方法

私は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";
                }
            }
        }
    }
}
2

3 答え

の場合は の を

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

しかし、私はディスパッチテーブルでこれを匿名のサブシステムとして書き直したいと思っています。

7
追加された
if($ result - > {directory}){..} if($ result - > {directory}){空の文字列と一致します。
追加された 著者 Zaid,
ありがとう。返すデータがない場合、空の文字列について ref をチェックすることはできますか?
追加された 著者 cjd143SD,

私はシンプルなif-elsifがswitch-likeコードを置き換えるのに十分であると思います。

The CPAN Switch is a source filter thus I guess it will generate similar code to if-elsif. And it has some limitation when you use it in eval: "Due to the way source filters work in Perl, you can't use Switch inside an string eval." http://perldoc.perl.org/5.8.9/Switch.html

3
追加された
@cjd - elsifの試みを投稿して、何が間違っているかを確認してください
追加された 著者 DVK,
ありがとう。私はif-elsifでこれを試していて、ネスティングに固執しています。 if-elsifで私を見せてもらえますか?
追加された 著者 cjd143SD,

私の個人的な好みは 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 ブロックの後に; を忘れないでください。

編集:あなたは次のケースに落ちたくない場合は、または最後を使用することを忘れないでください。

2
追加された