length#
Επιστρέφει τον αριθμό των χαρακτήρων μιας συμβολοσειράς.
Η length μετατρέπει το όρισμά της σε συμβολοσειρά και επιστρέφει πόσους χαρακτήρες περιέχει η συμβολοσειρά αυτή. «Χαρακτήρες» σημαίνει λογικούς χαρακτήρες της Perl, όχι bytes: μια συμβολοσειρά που κρατά δέκα κωδικοσημεία έχει length 10 ανεξάρτητα από το πόσα bytes καταλαμβάνουν αυτά τα κωδικοσημεία όταν κωδικοποιηθούν ως UTF-8 σε δίσκο ή στο καλώδιο.
Σύνοψη#
length EXPR
length
Τι επιστρέφεται#
Ένας μη αρνητικός ακέραιος - το πλήθος των χαρακτήρων στη συμβολοσειροποιημένη τιμή της EXPR. Αν η EXPR παραλειφθεί, η length δρα επί της $_. Αν η EXPR είναι undef, το αποτέλεσμα είναι undef, όχι 0· αυτή είναι η μοναδική περίπτωση που η length δεν επιστρέφει αριθμό, και είναι σκόπιμη - σας επιτρέπει να διακρίνετε ένα μη ορισμένο βαθμωτό από μια κενή συμβολοσειρά χωρίς ξεχωριστό έλεγχο defined:
length(undef) # undef
length("") # 0
length("abc") # 3
Χαρακτήρες, όχι bytes#
Σε μια κανονική συμβολοσειρά Perl, η length μετρά χαρακτήρες. Το πλήθος των bytes της ίδιας συμβολοσειράς κωδικοποιημένης ως UTF-8 είναι εν γένει διαφορετικό και είναι αυτό που θέλουν τα εξωτερικά συστήματα (μεγέθη αρχείων, ωφέλιμα φορτία δικτύου, κεφαλίδες Content-Length). Πάρτε το κωδικοποιώντας πρώτα:
use Encode;
my $s = "na\x{EF}ve"; # five characters
my $chars = length $s; # 5
my $bytes = length(encode('UTF-8', $s)); # 6
Δείτε το Encode και το perlunicode για ολόκληρη την ιστορία για το πώς οι συμβολοσειρές Perl φέρουν εσωτερική σημαία χαρακτήρων-έναντι-bytes και πότε αυτή η σημαία έχει σημασία.
Παραδείγματα#
Βασική μέτρηση:
length "hello" # 5
length "" # 0
Το προεπιλεγμένο όρισμα είναι η $_:
for ("a", "bb", "ccc") {
print length, "\n"; # 1, 2, 3
}
Διάκριση μη ορισμένου από κενό:
my $x;
my $y = "";
print defined(length $x) ? "set" : "undef", "\n"; # undef
print defined(length $y) ? "set" : "undef", "\n"; # set
Μια συμβολοσειρά Unicode - μέτρηση χαρακτήρων έναντι μέτρησης bytes:
my $s = "caf\x{E9}"; # four characters, one of them non-ASCII
length $s; # 4
length encode('UTF-8', $s); # 5
Οι αριθμοί μετατρέπονται σε συμβολοσειρά πριν τη μέτρηση, πράγμα ενίοτε χρήσιμο και ενίοτε εκπληκτικό:
length 12345 # 5
length 3.14 # 4 ("3.14")
length 1e6 # 7 ("1000000")
Οριακές περιπτώσεις#
undefμέσα,undefέξω. Ηlength(undef)επιστρέφειundef, όχι0. Υπόuse warnings, η ανάγνωση ενός μη ορισμένου βαθμωτού μέσωlength $xόπου το$xείναι undef δεν εκπέμπει προειδοποίησηuninitialized, σε αντίθεση με τους περισσότερους άλλους τελεστές.Ολόκληρος πίνακας ή hash: η
lengthδεν μετρά στοιχεία. Συμβολοσειροποιεί το όρισμά της, οπότε ηlength @arrπρώτα αποτιμά τον@arrσε βαθμωτό περιβάλλον (το πλήθος των στοιχείων του) και κατόπιν μετρά τα ψηφία αυτού του αριθμού. Για το πραγματικό μέγεθος χρησιμοποιήστεscalar @arrήscalar keys %hash:my @arr = (1) x 100; length @arr; # 3 (digits of "100") scalar @arr; # 100
Δεμένα ή μαγικά βαθμωτά: η
lengthενεργοποιεί FETCH, οπότε η μετρούμενη τιμή είναι ό,τι επιστρέφει το στρώμα tie εκείνη τη στιγμή.Αντικείμενα με υπερφόρτωση: η
length $objκαλεί την υπερφόρτωση συμβολοσειροποίησης""(ή υποχωρεί στην προεπιλεγμένη μορφή αναφοράς) και μετρά χαρακτήρες στη συμβολοσειρά που προκύπτει.Πλατείς χαρακτήρες από είσοδο bytes: μια συμβολοσειρά που διαβάστηκε από handle χωρίς στρώμα κωδικοποίησης είναι συμβολοσειρά bytes. Η
lengthτότε μετρά bytes - επειδή για την Perl κάθε byte είναι ένας χαρακτήρας. Αποκωδικοποιήστε πρώτα αν θέλετε μέτρηση χαρακτήρων:open my $fh, "<:raw", $path or die $!; my $bytes = do { local $/; <$fh> }; my $text = decode('UTF-8', $bytes); length $bytes; # byte count length $text; # character count
Locale και pragma: σε αντίθεση με τις
lc/uc/fc, ηlengthδεν μεταβάλλεται υπόuse locale. Ένας χαρακτήρας είναι χαρακτήρας ανεξαρτήτως.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
scalar- επιβολή βαθμωτού περιβάλλοντος· ο σωστός τρόπος να πάρετε πλήθος στοιχείων από έναν πίνακα (scalar @arr) αντί για το length του συμβολοσειροποιημένου πλήθους τουsubstr- εξάγει υποσυμβολοσειρά κατά μετατόπιση χαρακτήρα· ζευγαρώνει φυσικά με τηνlengthγια εργασίες τεμαχισμούindex- βρίσκει τη θέση μιας υποσυμβολοσειράς· επιστρέφει μετατόπιση χαρακτήρα μετρημένη με τον ίδιο τρόπο που μετρά ηlengthsprintf- τα πλάτη πεδίου%sείναι πλήθη χαρακτήρων, ίδια έννοια με τηνlengthreverse- σε βαθμωτό περιβάλλον αντιστρέφει μια συμβολοσειρά χαρακτήρα προς χαρακτήρα· ίδιο μοντέλο χαρακτήρα με τηνlengthpos- θέση αντιστοίχισης regex, επίσης σε χαρακτήρες