Ροή ελέγχου

break#

Έξοδος από ένα μπλοκ given.

Η break τερματίζει αμέσως το περικλείον μπλοκ given και μεταφέρει τον έλεγχο στην επόμενη δήλωση - το ανάλογο της last για βρόχους, εδώ για given. Δεν δέχεται ορίσματα, δεν επιστρέφει τιμή, και εφαρμόζεται μόνο στο εσώτατο given· δεν μπορεί να στοχεύσει εξωτερικό μπλοκ με ετικέτα.

Σύνοψη#

break

Διαθεσιμότητα - διαβάστε πρώτα αυτό#

break is a keyword of the switch feature, together with given, when, default, and (inside a when) continue. In Perl 5.44 the switch feature is disabled by default and is not part of any current feature bundle: use v5.36 through use v5.44 do not turn it on. The feature still exists and can be used, but only under explicit opt-in:

use feature 'switch';
no warnings 'experimental::smartmatch';

Χωρίς αυτή την ενεργοποίηση, η bareword break αναλύεται ως απλή κλήση υπορουτίνας και αποτυγχάνει κατά τη μεταγλώττιση με Bareword "break" not allowed while "strict subs" in use, ή κατά τον χρόνο εκτέλεσης με Undefined subroutine &main::break called. Η πλήρως κατονομασμένη μορφή CORE::break λειτουργεί από οποιαδήποτε εμβέλεια χωρίς ενεργοποίηση του χαρακτηριστικού και είναι ο τρόπος να την καλέσετε σε κώδικα που κατά τα άλλα διατηρεί το switch ανενεργό.

Τα given/when βασίζονται στο smartmatch (~~), το οποίο είναι το ίδιο πειραματικό και προειδοποιεί σε κάθε χρήση εκτός αν κατασταλούν οι προειδοποιήσεις experimental::smartmatch. Νέος κώδικας δεν πρέπει να καταφεύγει στα given/when/break· δείτε Replacements παρακάτω.

Συμπεριφορά#

Μέσα σε μπλοκ given, η break ξετυλίγει μέχρι τη δήλωση αμέσως μετά το μπλοκ. Είναι ισοδύναμη με αυτό που πέφτει σιωπηρά από το κάτω μέρος ενός κλάδου when - οι ρήτρες when εκτελούν break στο τέλος του σώματός τους εκτός αν το σώμα τελειώνει σε continue, οπότε ρητή break χρησιμοποιείται κυρίως για πρόωρη έξοδο από μακρύ σώμα when:

use feature 'switch';
no warnings 'experimental::smartmatch';

given ($cmd) {
    when ('quit') {
        cleanup();
        break if $fast_exit;        # skip the logging below
        log_exit();
    }
    when ('help') { show_help() }
    default       { warn "unknown: $cmd" }
}

Εκτός μπλοκ given, η break εγείρει Can't "break" outside a given block κατά τον χρόνο εκτέλεσης.

Αντικαταστάσεις#

Για νέο κώδικα, προτιμήστε μία από αυτές τις μορφές. Είναι απλή Perl, δεν χρειάζονται ενεργοποίηση χαρακτηριστικού, και δεν έχουν συννεφιά απαξίωσης από πάνω τους:

  • Αλυσίδα if / elsif / else - άμεση αντικατάσταση για τις περισσότερες χρήσεις given/when:

    if    ($cmd eq 'quit') { cleanup(); log_exit() }
    elsif ($cmd eq 'help') { show_help() }
    else                   { warn "unknown: $cmd" }
    
  • Πίνακας αποστολής - ένας hash από coderefs με κλειδί την είσοδο, με προεπιλεγμένο κλάδο. Κλιμακώνεται καλύτερα από μια μακριά σκάλα elsif και κάνει το σύνολο των χειριζόμενων περιπτώσεων δεδομένα αντί για ροή ελέγχου:

    my %dispatch = (
        quit => sub { cleanup(); log_exit() },
        help => \&show_help,
    );
    ($dispatch{$cmd} // sub { warn "unknown: $cmd" })->();
    
  • Βρόχος με ετικέτα με last - όταν θέλετε συγκεκριμένα τη μορφή «πρόωρη έξοδος από αυτό το μπλοκ» που παρείχε η break, τυλίξτε το σώμα σε σκέτο μπλοκ και κάντε last από αυτό:

    CMD: {
        if ($cmd eq 'quit') { cleanup(); last CMD if $fast_exit; log_exit(); last CMD }
        if ($cmd eq 'help') { show_help(); last CMD }
        warn "unknown: $cmd";
    }
    

Παραδείγματα#

Ρητή ενεργοποίηση χαρακτηριστικού, πρόωρη έξοδος από σώμα when:

use feature 'switch';
no warnings 'experimental::smartmatch';

given ($n) {
    when ($_ < 0) { warn "negative"; break }   # skip the log below
    when (0)      { warn "zero" }
    default       { warn "positive: $n" }
}
# control resumes here after break

Χρήση της CORE::break χωρίς καθολική ενεργοποίηση του χαρακτηριστικού:

sub classify {
    my ($n) = @_;
    given ($n) {
        when ($_ < 0) { return "neg"; CORE::break }
        when (0)      { return "zero" }
        default       { return "pos" }
    }
}

Οριακές περιπτώσεις#

  • Καμία μορφή ορίσματος. Η break δεν δέχεται τίποτα. Το break LABEL είναι συντακτικό σφάλμα - σε αντίθεση με τα last/next, η break δεν έχει τρόπο να στοχεύσει εξωτερικό μπλοκ.

  • Εκτός given. Η κλήση της break (ή της CORE::break) όταν δεν υπάρχει μπλοκ given στη στοίβα κλήσεων εγείρει Can't "break" outside a given block.

  • Η return υπερισχύει. Μέσα σε υπορουτίνα, η return ξετυλίγει ολόκληρη την sub ανεξάρτητα από οποιοδήποτε περικλείον given. Η break ξετυλίγει μόνο μέχρι το τέλος του given· ο έλεγχος συνεχίζει στην περιβάλλουσα sub.

  • Σιωπηρή break στο τέλος της when. Το σώμα μιας ρήτρας when τελειώνει με σιωπηρή break εκτός αν το σώμα είναι continue, οπότε ρητή break στο τέλος σώματος when είναι περιττή. Η continue καταστέλλει τη σιωπηρή break και αφήνει τον έλεγχο να περάσει στην επόμενη when.

  • Δεν είναι δεσμευμένη λέξη βρόχου. Η break δεν αλληλεπιδρά με τα for, while, foreach, do, ή σκέτα μπλοκ. Για αυτά, χρησιμοποιήστε τη last.

  • Πειραματικές προειδοποιήσεις. Η εκτέλεση κώδικα given/when χωρίς no warnings 'experimental::smartmatch' εκτυπώνει την προειδοποίηση μία φορά ανά σημείο smartmatch, που σε ένα πολυάσχολο μπλοκ given μπορεί να είναι κάθε επανάληψη.

Διαφορές από το upstream#

Fully compatible with upstream Perl 5.44.

Δείτε επίσης#

  • last - το αντίστοιχο για βρόχο· εξέρχεται από το εσώτατο περικλείον for / while / foreach / σκέτο μπλοκ, και σε αντίθεση με την break μπορεί να στοχεύσει εξωτερικό μπλοκ με ετικέτα

  • next - ξεκινά την επόμενη επανάληψη βρόχου αντί να εξέρχεται από αυτόν· χρήσιμη όταν η break είναι λάθος μορφή επειδή θέλετε συνέχιση, όχι τερματισμό

  • return - ξετυλίγει εντελώς από την περικλείουσα υπορουτίνα, όχι μόνο από το μπλοκ given· χρησιμοποιήστε την όταν η given είναι διανομέας μέσα σε sub και η απάντηση είναι έτοιμη