Ροή ελέγχου

break#

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

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

Σύνοψη#

break

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

Η break είναι δεσμευμένη λέξη του χαρακτηριστικού switch, μαζί με τις given, when, default, και (μέσα σε when) continue. Στην Perl 5.42 το χαρακτηριστικό switch είναι απενεργοποιημένο εξ ορισμού και δεν αποτελεί μέρος κανενός τρέχοντος feature bundle: τα use v5.36 έως use v5.42 δεν το ενεργοποιούν. Το χαρακτηριστικό εξακολουθεί να υπάρχει και μπορεί να χρησιμοποιηθεί, αλλά μόνο με ρητή ενεργοποίηση:

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#

Πλήρως συμβατό με το upstream Perl 5.42.

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

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

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

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