Βαθμωτά και συμβολοσειρές

chop#

Αφαιρεί τον τελευταίο χαρακτήρα μιας συμβολοσειράς και τον επιστρέφει.

Η chop συντομεύει επιτόπου το όρισμά της κατά ακριβώς έναν χαρακτήρα και επιστρέφει τον χαρακτήρα που αφαιρέθηκε. Δεν σαρώνει τη συμβολοσειρά και δεν την αντιγράφει - απλώς μετακινεί το τέλος. Αν παραλειφθεί η VARIABLE, η chop λειτουργεί στο $_. Αν η VARIABLE είναι hash, η chop κάνει chop κάθε τιμή του hash (όχι τα κλειδιά) και επαναφέρει τον επαναλήπτη each του hash ως παρενέργεια. Κάθε lvalue είναι έγκυρος στόχος, συμπεριλαμβανομένης μιας έκφρασης ανάθεσης.

Σύνοψη#

chop VARIABLE
chop( LIST )
chop

Τι επιστρέφεται#

Ο χαρακτήρας που αφαιρέθηκε, ως συμβολοσειρά. Αν ο στόχος ήταν κενός ή απροσδιόριστος, επιστρέφεται η κενή συμβολοσειρά και ο στόχος μένει αμετάβλητος. Όταν η chop εφαρμόζεται σε λίστα, κάθε στοιχείο υφίσταται chop, αλλά επιστρέφεται μόνο ο χαρακτήρας που αφαιρέθηκε από το τελευταίο στοιχείο.

my $last = chop $line;     # one character, or "" if $line was empty

Καθολική κατάσταση που επηρεάζει#

Διαβάζει το $_ όταν καλείται χωρίς όρισμα. Καμία άλλη ειδική μεταβλητή δεν συμβουλεύεται - ειδικότερα, η chop δεν επηρεάζεται από το $/ (τον διαχωριστή εγγραφών εισόδου), που είναι έγνοια της chomp.

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

Chop ενός βαθμωτού:

my $s = "hello";
my $c = chop $s;            # $s is now "hell", $c is "o"

Chop στο $_ όταν δεν δίνεται όρισμα - ιδιωματικό μέσα σε βρόχο ανάγνωσης που θέλει τον τερματιστή να φύγει ανεξάρτητα από το τι είναι:

while (<$fh>) {
    chop;                   # drops whatever character ends the line
    push @rows, $_;
}

Chop μιας λίστας. Κάθε στοιχείο χάνει τον τελευταίο του χαρακτήρα· η τιμή επιστροφής είναι ο χαρακτήρας που αφαιρέθηκε μόνο από το τελευταίο στοιχείο:

my @lines = ("foo\n", "bar\n", "baz!");
my $last  = chop @lines;    # @lines is ("foo","bar","baz"), $last is "!"

Chop ενός hash. Οι τιμές υφίστανται chop, τα κλειδιά όχι, και ο επαναλήπτης each επαναφέρεται:

my %h = (a => "one\n", b => "two\n");
chop %h;                    # %h is (a => "one", b => "two")

Chop ανάθεσης - η chop δουλεύει με κάθε lvalue, και η ανάθεση επιστρέφει lvalue:

chop(my $cwd = `pwd`);      # strip the trailing newline from pwd's output

Διατήρηση όλων εκτός από τον τελευταίο χαρακτήρα χωρίς τροποποίηση του πρωτοτύπου - δεν είναι δουλειά για την chop, που μεταλλάσσει. Χρησιμοποιήστε αντί αυτής την substr με αρνητικό μήκος:

my $head = substr($s, 0, -1);   # $s is unchanged

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

  • Κενός ή απροσδιόριστος στόχος: επιστρέφει την κενή συμβολοσειρά "" και αφήνει τον στόχο ως έχει. Η chop σε undef δεν εγείρει από μόνη της προειδοποίηση· απλώς παράγει "".

  • Στόχος μόνο για ανάγνωση: εγείρει Modification of a read-only value attempted. Αυτό περιλαμβάνει κυριολεκτικές τιμές συμβολοσειρών και τιμές σημειωμένες ως μόνο για ανάγνωση μέσω της Internals::SvREADONLY.

  • Συμβολοσειρές UTF-8: η chop αφαιρεί έναν χαρακτήρα, όχι ένα byte. Ένας χαρακτήρας πολλαπλών bytes στο τέλος της συμβολοσειράς αφαιρείται ολόκληρος και επιστρέφεται ως συμβολοσειρά UTF-8. Η σημαία UTF-8 του στόχου διατηρείται σε ό,τι απομένει.

  • Τιμή επιστροφής λίστας: επιστρέφεται μόνο ο χαρακτήρας που αφαιρέθηκε από το τελευταίο στοιχείο· οι υπόλοιποι απορρίπτονται. Αν χρειάζεστε κάθε αφαιρούμενο χαρακτήρα, κάντε chop στα στοιχεία μεμονωμένα σε έναν βρόχο.

  • Ένας χαρακτήρας έναντι τερματισμού γραμμής: η chop αφαιρεί άνευ όρων έναν χαρακτήρα, ό,τι κι αν είναι αυτός - συμπεριλαμβανομένων κενών, ψηφίων ή γραμμάτων. Για να αφαιρέσετε υπό συνθήκη έναν τερματιστή γραμμής (αυτό που λέει το $/ ότι μοιάζει), χρησιμοποιήστε την chomp.

  • Παρενθεσιοποίηση του αναλυτή: η chop($x = $y) κάνει chop στο αποτέλεσμα της ανάθεσης, που είναι το $x. Η chop $x, $y αναλύεται ως chop($x), $y - το κόμμα δεν επεκτείνει τη λίστα ορισμάτων της chop χωρίς παρενθέσεις. Γράψτε chop($x, $y) όταν εννοείτε τη μορφή λίστας.

  • Επαναφορά επανάληψης του hash: επειδή η chop %h διασχίζει τις τιμές μέσω του επαναλήπτη του hash, οποιοσδήποτε εν εξελίξει βρόχος each πάνω από το %h ακυρώνεται.

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

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

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

  • chomp - υπό συνθήκη ξαδέρφη: αφαιρεί τελικό $/, όχι έναν τελευταίο χαρακτήρα χωρίς όρους· επιστρέφει τον αριθμό των χαρακτήρων που αφαιρέθηκαν αντί για τον ίδιο τον χαρακτήρα

  • substr - μη καταστροφική εναλλακτική· η substr($s, 0, -1) επιστρέφει όλα εκτός από τον τελευταίο χαρακτήρα χωρίς να μεταλλάσσει το $s

  • s/// - η $s =~ s/.\z//s είναι το αντίστοιχο σε regex και αυτή από την οποία η chop είναι ρητά ταχύτερη, επειδή η chop ούτε σαρώνει ούτε αντιγράφει

  • lc, uc - άλλοι (κατά προσέγγιση) επιτόπιοι μετασχηματισμοί συμβολοσειρών που δέχονται κάθε lvalue

  • $_ - ο σιωπηρός στόχος όταν η chop καλείται χωρίς όρισμα

  • $/ - δεν συμβουλεύεται από την chop· τεκμηριώνεται εδώ μόνο για να επισημανθεί η αντίθεση με την chomp