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

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 - βρίσκει τη θέση μιας υποσυμβολοσειράς· επιστρέφει μετατόπιση χαρακτήρα μετρημένη με τον ίδιο τρόπο που μετρά η length

  • sprintf - τα πλάτη πεδίου %s είναι πλήθη χαρακτήρων, ίδια έννοια με την length

  • reverse - σε βαθμωτό περιβάλλον αντιστρέφει μια συμβολοσειρά χαρακτήρα προς χαρακτήρα· ίδιο μοντέλο χαρακτήρα με την length

  • pos - θέση αντιστοίχισης regex, επίσης σε χαρακτήρες