hoe de code perl switch-achtige verklaring te gebruiken voor gebruik met 5.8

Ik heb deze specifieke code die perl 5.10 gebruikt (voor switch-achtige werking), maar moet deze aan de praat krijgen op 5.8. Wat is een andere manier om dit voor 5.8 te schrijven? Een gewenste manier/techniek?

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 antwoord

Het vervangen van de gegeven / wanneer s met als / elsif is eenvoudig genoeg.

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

Maar ik ben geneigd om dit te herschrijven als anonieme subs met een verzendtabel.

7
toegevoegd
if (! $ result -> {directory}) {...} of if ($ result -> {directory}) eq '') {..} zal overeenkomen met een lege string.
toegevoegd de auteur Zaid, de bron
bedankt. als ik geen gegevens heb om terug te keren, kan ik ook ref controleren op lege string?
toegevoegd de auteur cjd143SD, de bron

Ik denk dat simpel if-elsif voldoende zou zijn om de switch-achtige code daar te vervangen.

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
toegevoegd
@cjd - plaats alstublieft uw elsif-poging, zodat we kunnen zien wat er mis is
toegevoegd de auteur DVK, de bron
Bedankt. Ik probeer dit met if-elsif en blijf bij het nest. Kun je me laten zien met if-elsif?
toegevoegd de auteur cjd143SD, de bron

Mijn persoonlijke voorkeur is om voor , een regex en een do blok te gebruiken:

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

Vergeet de ; na elk do blok niet.

EDIT: En vergeet niet om next of last te gebruiken als u niet wilt doorgaan naar de volgende case.

2
toegevoegd