chomp#
Αφαιρεί τον τελικό διαχωριστή εγγραφών εισόδου από μια συμβολοσειρά, επιτόπια.
Η chomp αφαιρεί κάθε τελική υποσυμβολοσειρά που ταιριάζει με την τρέχουσα τιμή της $/ από το όρισμά της και επιστρέφει το σύνολο των χαρακτήρων που αφαιρέθηκαν από κάθε όρισμα που επηρέασε. Μεταβάλλει το όρισμά της· η τιμή επιστροφής είναι μετρητής, όχι η συμβολοσειρά μετά το chomp. Αν δεν δοθεί όρισμα, λειτουργεί επί της $_. Η chomp είναι ο ασφαλέστερος αντίστοιχος της chop: αφαιρεί τον διαχωριστή μόνο αν είναι πράγματι παρών, και σέβεται την $/ ώστε να κάνει το σωστό σε αρχεία που τερματίζουν χωρίς τελικό newline ή χρησιμοποιούν τερματιστή εγγραφών που δεν είναι newline.
Σύνοψη#
chomp VARIABLE
chomp( LIST )
chomp
Τι επιστρέφεται#
Ο συνολικός αριθμός χαρακτήρων που αφαιρέθηκαν, ως ακέραιος. Συνήθως 0 (δεν υπήρχε διαχωριστής) ή 1 (αφαιρέθηκε ένα "\n" υπό την προεπιλογή της $/). Όταν η $/ είναι συμβολοσειρά πολλών χαρακτήρων, ένα επιτυχημένο chomp επιστρέφει το μήκος της. Όταν γίνεται chomp σε λίστα, ο μετρητής αθροίζεται σε όλα τα στοιχεία.
Η τιμή μετά το chomp βρίσκεται στη μεταβλητή που περάσατε· η chomp καλείται για το αποτέλεσμα, όχι για την τιμή επιστροφής της:
my $line = "hello\n";
my $n = chomp $line; # $line is "hello", $n is 1
Καθολική κατάσταση που επηρεάζει#
$/- διαχωριστής εγγραφών εισόδου. Ηchompδιαβάζει την$/σε κάθε κλήση και αφαιρεί μια τελική εμφάνιση της τρέχουσας τιμής της. Η αλλαγή της$/αλλάζει αυτό που αφαιρεί ηchomp· αυτό είναι συνήθως αυτό που θέλετε όταν θέτετε την$/για να διαβάσετε εγγραφές με προσαρμοσμένο διαχωρισμό.$_- καταναλώνεται ως το προεπιλεγμένο όρισμα όταν ηchompκαλείται χωρίς όρισμα. Ηchomp;μέσα σεwhile (<>) { ... }είναι το κανονικό ιδίωμα.Επαναλήπτης πίνακα κατακερματισμού - το chomp σε πίνακα κατακερματισμού επαναφέρει τον επαναλήπτη του
each(δείτε Οριακές περιπτώσεις).
Παραδείγματα#
Η καθημερινή χρήση - αφαιρέστε το τελικό newline από την είσοδο:
while (my $line = <$fh>) {
chomp $line;
# process $line without the trailing "\n"
}
Η μορφή χωρίς όρισμα λειτουργεί επί της $_:
while (<>) {
chomp; # removes "\n" from $_
my @fields = split /:/;
}
Chomp σε ανάθεση lvalue - οι παρενθέσεις είναι απαραίτητες ώστε το όρισμα στην chomp να είναι ολόκληρη η ανάθεση, όχι μόνο η μεταβλητή:
chomp(my $cwd = `pwd`); # strip "\n" from command output
chomp(my $answer = <STDIN>); # strip "\n" from user input
Chomp σε λίστα - γίνεται chomp σε κάθε στοιχείο και επιστρέφεται ο συνολικός μετρητής:
my @lines = ("a\n", "b\n", "no-nl");
my $n = chomp @lines; # @lines = ("a", "b", "no-nl"), $n = 2
Προσαρμοσμένος διαχωριστής εγγραφών - η chomp ακολουθεί ό,τι έχει τεθεί στην $/:
local $/ = "\r\n";
my $line = "GET / HTTP/1.0\r\n";
chomp $line; # removes "\r\n", returns 2
Λειτουργία παραγράφου - το $/ = "" κάνει την chomp να αφαιρέσει όλα τα τελικά newlines από τη συμβολοσειρά:
local $/ = "";
my $para = "line one\nline two\n\n\n";
chomp $para; # $para is "line one\nline two"
Οριακές περιπτώσεις#
No separator present: a no-op. Returns
0and leaves the argument unchanged. This is the whole point ofchompoverchopsafe to call on strings that may or may not end in
$/.
Όρισμα
undef: το chomp σε απροσδιόριστο βαθμωτό το αφήνει απροσδιόριστο και επιστρέφει0. Υπόuse warningsαυτό εκπέμπει προειδοποίησηuninitialized.Όρισμα πίνακα κατακερματισμού: η
chomp %hκάνει chomp σε κάθε τιμή (όχι στα κλειδιά) και επαναφέρει τον επαναλήπτηeachτου πίνακα. Ένας βρόχοςwhile (my ($k, $v) = each %h)σε εξέλιξη πάνω στον%hθα διαταραχθεί.Λειτουργία slurp (
$/ = undef) και λειτουργία εγγραφών σταθερού μήκους ($/τεθειμένη σε αναφορά σε ακέραιο): ηchompδεν αφαιρεί τίποτα και επιστρέφει0. Δεν υπάρχει έννοια τελικού διαχωριστή σε αυτές τις λειτουργίες.Παγίδα με παρενθέσεις στην ανάθεση: χωρίς παρενθέσεις, η
chompδένει ισχυρότερα από το=:chomp $cwd = `pwd`; # parsed as (chomp $cwd) = `pwd`; chomp( $cwd = `pwd` ); # what you meant
Ίδια παγίδα με λίστα κόμματος χωρίς παρενθέσεις:
chomp $x, $y; # parsed as chomp($x), $y; chomp( $x, $y ); # chomps both
Λειτουργεί οποιοδήποτε lvalue, όχι μόνο απλά βαθμωτά. Στοιχεία πίνακα και πίνακα κατακερματισμού, τομές, αποαναφορές και εκφράσεις ανάθεσης είναι όλα νόμιμοι στόχοι.
Σταθερές και τιμές μόνο για ανάγνωση: το chomp σε συμβολοσειρά μόνο για ανάγνωση εκπέμπει σφάλμα
Modification of a read-only value attempted. Οι κυριολεκτικές συμβολοσειρές είναι μόνο για ανάγνωση.Πολυ-byte
$/: ηchompσυγκρίνει bytes της συμβολοσειράς με bytes της$/. Αν η συμβολοσειρά και η$/διαφωνούν ως προς την κωδικοποίηση (η μία έχει τεθεί η σημαία UTF-8, η άλλη όχι), η σύγκριση γίνεται στην εσωτερική αναπαράσταση bytes και μπορεί να σας εκπλήξει. Κρατήστε και τις δύο πλευρές στην ίδια κωδικοποίηση.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
chop- αφαιρεί χωρίς όρους τον τελευταίο χαρακτήρα και τον επιστρέφει· παλαιότερο, λιγότερο εκλεπτυσμένο εργαλείο που έχει αντικατασταθεί από τηνchompγια καθαρισμό εισόδουsplit- συχνά το επόμενο βήμα μετά τηνchomp, διασπά την πλέον καθαρισμένη εγγραφή σε πεδίαreadline/<>- διαβάζει εγγραφές που τερματίζονται από την$/· ηchompαναιρεί τον τερματιστή που άφησε ηreadlineeach- ο επαναλήπτης πίνακα κατακερματισμού που ηchomp %hashεπαναφέρει$/- διαχωριστής εγγραφών εισόδου· ηchompτο διαβάζει σε κάθε κλήση$_- προεπιλεγμένο όρισμα όταν ηchompκαλείται χωρίς ρητό στόχο