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

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 0 and leaves the argument unchanged. This is the whole point of chomp over chop

    • safe 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 αναιρεί τον τερματιστή που άφησε η readline

  • each - ο επαναλήπτης πίνακα κατακερματισμού που η chomp %hash επαναφέρει

  • $/ - διαχωριστής εγγραφών εισόδου· η chomp το διαβάζει σε κάθε κλήση

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