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 και η απάντηση είναι έτοιμη