5.8 ile kullanmak için kod perl geçiş benzeri bir ifade nasıl yapılır

Perl 5.10 (anahtar benzeri işlem için) kullanan bu özel koda sahibim, ancak 5.8 üzerinde çalışmam gerekiyor. Bunu 5.8 için yazmanın başka bir yolu nedir? Tercih edilen bir yol/teknik mi?

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 cevap

/ elsif ile olduğunda verilen / kodunun değiştirilmesi yeterlidir.

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

Ama bunu bir gönderme tablosu ile anonim bir alt olarak yeniden yazmak için cazip.

7
katma
if (! $ sonuç -> {directory}) {...} veya if ($ sonuç -> {directory}) eq '') {..} yapacak boş bir dizeyle eşleştir.
katma yazar Zaid, kaynak
Teşekkürler. Dönecek veri yoksa, boş dizge için ref 'i de kontrol edebilir miyim?
katma yazar cjd143SD, kaynak

Bence el-ifs, oradaki anahtar benzeri kodu değiştirmek için yeterli olur.

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
katma
@cjd - lütfen elsif girişimi gönderin, böylece neyin yanlış olduğunu görebiliriz
katma yazar DVK, kaynak
Teşekkürler. Bunu if-elsif ile deniyorum ve yuvalama ile sıkışıp kaldım. İf-elsif ile bana gösterebilir misin?
katma yazar cjd143SD, kaynak

Kişisel tercihim , normal ifade ve bloğu için kullanmaktır:

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

Her bloğundan sonra ; ununu unutmayın.

EDIT: Sonraki duruma geçmek istemiyorsanız next veya last 'ı kullanmayı da unutmayın.

2
katma