Βαθμωτά και συμβολοσειρές · Λίστες
reverse#
Αντιστρέφει μια λίστα - ή, σε βαθμωτό περιβάλλον, αντιστρέφει τους χαρακτήρες μιας συμβολοσειράς.
Η reverse είναι δύο τελεστές που φορούν το ίδιο όνομα. Το περιβάλλον αποφασίζει ποιον λαμβάνετε. Σε περιβάλλον λίστας επιστρέφει τη LIST με τα στοιχεία της σε αντίθετη σειρά· οι τιμές των στοιχείων παραμένουν ανέπαφες. Σε βαθμωτό περιβάλλον συνενώνει τη LIST σε μία συμβολοσειρά και επιστρέφει αυτή τη συμβολοσειρά με όλους τους χαρακτήρες της αντεστραμμένους. Το συνηθισμένο λάθος να γραφτεί my $s = reverse $str περιμένοντας αντεστραμμένη λίστα (ή print reverse $str περιμένοντας αντεστραμμένη συμβολοσειρά) είναι η μεγαλύτερη παγίδα αυτής της συνάρτησης - δείτε Οριακές περιπτώσεις.
Σύνοψη#
my @r = reverse @arr # list context: elements reversed
my $s = reverse $str # scalar context: characters reversed
my %inv = reverse %h # hash invert (value → key)
reverse # in scalar context, reverses $_
Τι επιστρέφεται#
Εξαρτάται από το περιβάλλον. Ο τελεστής επιθεωρεί το περιβάλλον του καλούντος του και διακλαδώνει:
Περιβάλλον λίστας → νέα λίστα με τα στοιχεία της
LISTσε αντίστροφη σειρά. Οι τιμές των στοιχείων δεν μετατρέπονται σε συμβολοσειρά, δεν τροποποιούνται, δεν αντιγράφονται σε επίπεδο χαρακτήρων. Μια λίστα αναφορών παραμένει λίστα των ίδιων αναφορών.Βαθμωτό περιβάλλον → μία συμβολοσειρά: η συνένωση των μετατραμμένων σε συμβολοσειρά στοιχείων της
LIST, με όλους τους χαρακτήρες σε αντίστροφη σειρά. Υπόuse utf8/ συμβολοσειρές πλατιών χαρακτήρων, η αντιστροφή γίνεται κατά χαρακτήρα, όχι κατά byte.
Αυτό σημαίνει ότι το ίδιο σημείο κλήσης επιστρέφει ριζικά διαφορετικά σχήματα ανάλογα με τον τρόπο που το χρησιμοποιείτε:
my @back = reverse "abc", "def"; # ("def", "abc")
my $back = reverse "abc", "def"; # "fedcba"
Όταν χρησιμοποιείται χωρίς ορίσματα σε βαθμωτό περιβάλλον, η reverse αντιστρέφει το $_. Όταν χρησιμοποιείται χωρίς ορίσματα σε περιβάλλον λίστας, η reverse επιστρέφει την κενή λίστα - όχι ένα αντεστραμμένο $_. Το print reverse; δεν παράγει έξοδο.
Καθολική κατάσταση που επηρεάζει#
Διαβάζει το $_ όταν καλείται χωρίς ορίσματα σε βαθμωτό περιβάλλον. Αυτή είναι η μόνη καθολική που αγγίζει. Δεν τροποποιεί το $_· επιστρέφει την αντεστραμμένη συμβολοσειρά.
Παραδείγματα#
Αντιστροφή λίστας. Τα ίδια τα στοιχεία παραμένουν αμετάβλητα:
my @a = (1, 2, 3, 4, 5);
my @r = reverse @a; # (5, 4, 3, 2, 1)
Αντιστροφή συμβολοσειράς. Επιβάλετε βαθμωτό περιβάλλον με scalar όταν η περιβάλλουσα έκφραση θα ήταν διαφορετικά λίστα:
my $s = reverse "Hello, world"; # "dlrow ,olleH"
print scalar reverse "Hello"; # "olleH"
Επανάληψη πίνακα προς τα πίσω χωρίς κατασκευή δεύτερου πίνακα. Η reverse στην κεφαλίδα του βρόχου είναι κλήση σε περιβάλλον λίστας· η Perl καταναλώνει την αντεστραμμένη λίστα τεμπέλικα από τους μηχανισμούς του βρόχου:
my @stack = ("first", "second", "third");
for my $elem (reverse @stack) {
print "$elem\n"; # third / second / first
}
Φθίνουσα ταξινόμηση. Το reverse sort είναι το ιδίωμα όταν η σύγκρισή σας είναι αύξουσα και θέλετε το αντίθετο. Για οτιδήποτε πιο σύνθετο από την προεπιλεγμένη σύγκριση συμβολοσειρών, ανταλλάξτε τους τελεσταίους στον συγκριτή:
my @asc = sort { $a <=> $b } @nums;
my @desc = reverse sort { $a <=> $b } @nums; # works
my @desc2 = sort { $b <=> $a } @nums; # preferred
Αντιστροφή hash. Οι τιμές γίνονται κλειδιά, τα κλειδιά γίνονται τιμές:
my %by_name = (alice => 1, bob => 2, carol => 3);
my %by_id = reverse %by_name; # (1 => "alice", ...)
print $by_id{2}; # "bob"
Το κόλπο "dlrow ,olleH" - χρήση της reverse σε βαθμωτό περιβάλλον ως μονομερής αναστροφή χαρακτήρων σε μεταβλητή συμβολοσειράς:
my $word = "stressed";
my $rev = scalar reverse $word; # "desserts"
Οριακές περιπτώσεις#
Η Νο.1 παγίδα: περιβάλλον. Το
my $s = reverse @arrδεν σας δίνει αντεστραμμένο πίνακα· σας δίνει την αντεστραμμένη συμβολοσειρά που σχηματίζεται με συνένωση των στοιχείων του πίνακα και αναστροφή κάθε χαρακτήρα. Αν θέλετε αντεστραμμένο πίνακα αποθηκευμένο μέσω βαθμωτού, χρησιμοποιήστε αναφορά:my $ref = [ reverse @arr ].Μονό βαθμωτό, λάθος περιβάλλον. Το
my @r = reverse $strεπιστρέφει($str)- λίστα ενός στοιχείου που περιέχει το$strαμετάβλητο. Δεν υπάρχει τίποτα να αναδιαταχθεί. Για να αντιστρέψετε τους χαρακτήρες, επιβάλετε βαθμωτό περιβάλλον:my $r = reverse $strήmy @r = (scalar reverse $str).Η αντιστροφή hash χάνει δεδομένα σε διπλές τιμές. Η
reverse %hδιατρέχει τα ζεύγη κλειδιού/τιμής ως επίπεδη λίστα και ξαναχτίζει hash. Αν δύο κλειδιά μοιράζονται μία τιμή, ένα από τα δύο κερδίζει και το άλλο απορρίπτεται σιωπηλά· ποιο κερδίζει δεν είναι ορισμένο. Ελέγξτε πρώτα για μοναδικότητα αν αυτό έχει σημασία:my %seen; $seen{$_}++ for values %h; die "non-unique values" if grep { $_ > 1 } values %seen; my %inv = reverse %h;
Χωρίς ορίσματα σε περιβάλλον λίστας δεν κάνει τίποτα χρήσιμο. Η
reverseχωρίς ορίσματα επιστρέφει()σε περιβάλλον λίστας. Το$_συμβουλεύεται μόνο σε βαθμωτό περιβάλλον. Τοprint reverse;δεν τυπώνει τίποτα· τοprint scalar reverse;τυπώνει την αντιστροφή του$_.Κατά χαρακτήρα, όχι κατά byte. Για συμβολοσειρές πλατιών χαρακτήρων, η
reverseαντιστρέφει χαρακτήρες, όχι bytes. Μια συμβολοσειρά:utf8τριών code points παραμένει τριών code points μετά την αντιστροφή, ανεξάρτητα από τα πλάτη τους σε bytes. Η αντιστροφή ακατέργαστης συμβολοσειράς bytes με χαρακτήρες πολλαπλών bytes που δεν αποκωδικοποιήσατε ποτέ θα την αλλοιώσει - αποκωδικοποιήστε πρώτα.Η αυτο-ανάθεση διατηρεί τις τρύπες. Το
@a = reverse @aσε μη μαγικό ή καλοδιατεθειμένο tied πίνακα διατηρεί τα ανύπαρκτα στοιχεία στις αντεστραμμένες θέσεις τους· ένας αραιός πίνακας παραμένει αραιός.Το
reverse sortδεν είναι ίδιο με τοsort { $b cmp $a }. Και τα δύο δίνουν φθίνουσα σειρά για σταθερή προεπιλεγμένη σύγκριση, αλλά τοreverse sortκάνει δύο περάσματα πάνω στα δεδομένα και είναι μετρήσιμα πιο αργό σε μεγάλες λίστες. Προτιμήστε την ανταλλαγή των τελεσταίων του συγκριτή.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
sort- συνδυάστε με τηreverseγια φθίνουσα σειρά, ή ανταλλάξτε τα$a/$bστον συγκριτή για να αποφύγετε το δεύτερο πέρασμαpop- αφαίρεση από το τέλος ενός πίνακα όταν θέλετε απλώς το τελευταίο στοιχείο, όχι αντιστροφή όλης της λίσταςshift- αφαίρεση από την αρχή· συνδυασμένη με αντίγραφοreverse-αρισμένο σας δίνει πρόσβαση τύπου στοίβας στην αρχική ουράsplit- παράγει λίστα χαρακτήρων (με//) ή πεδίων που μπορείτε στη συνέχεια ναreverse-άρετεjoin- ο φυσικός σύντροφος όταν αντιστρέφετε λίστα συμβολοσειρών και θέλετε πίσω μία ενιαία συμβολοσειρά$_- ο προεπιλεγμένος στόχος όταν ηreverseκαλείται χωρίς ορίσματα σε βαθμωτό περιβάλλον