5.8 пайдалану үшін 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 жауаптар

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

Бірақ мен мұны анонимді жазба ретінде жөнелту кестесімен қайта жазуға талпынамын.

7
қосылды
if (! $ result -> {directory}) {...} немесе if ($ result -> {directory} eq '') {..} бос жолға сәйкес келтіріңіз.
қосылды автор Zaid, көзі
рахмет. егер қайтару үшін деректер жоқ болса, бос жол үшін ref -ді тексере аламын ба?
қосылды автор cjd143SD, көзі

Меніңше, қарапайым if-elsif коммутациялық кодты ауыстыру жеткілікті.

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, көзі
Рахмет. Мен мұны мен-элсифпен және ұя салуға тырысқанымен көргім келеді. Сіз мені «эльсифпен» көрсете аласыз ба?
қосылды автор cjd143SD, көзі

Жеке таңдауым for , regex және 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 блогынан кейін ; ұмытпаңыз.

EDIT: Келесі жағдайға түсіп қалғыңыз келмесе, келесі немесе last пайдалануды ұмытпаңыз.

2
қосылды