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

ord#

Επιστρέφει το σημείο κώδικα Unicode του πρώτου χαρακτήρα μιας συμβολοσειράς.

Η ord παίρνει μια συμβολοσειρά, εξετάζει τον πρώτο της χαρακτήρα, και επιστρέφει το αριθμητικό σημείο κώδικα αυτού του χαρακτήρα ως ακέραιο. Προσέξτε χαρακτήρας, όχι byte - αν η συμβολοσειρά είναι συμβολοσειρά ευρέων χαρακτήρων που περιέχει το γράμμα é (U+00E9), η ord επιστρέφει 233, ανεξάρτητα από το πόσα bytes καταλαμβάνει το é στη μνήμη. Για την κενή συμβολοσειρά, η ord επιστρέφει 0. Αν παραλειφθεί το EXPR, η ord λειτουργεί στο $_.

Για την αντίστροφη κατεύθυνση - μετατροπή σημείου κώδικα πίσω σε χαρακτήρα - δείτε την chr.

Σύνοψη#

ord EXPR
ord
ord($str)

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

Μη αρνητικός ακέραιος. Για είσοδο ASCII είναι στο εύρος 0..127· για είσοδο Latin-1 0..255· για γενική συμβολοσειρά Unicode οτιδήποτε έως το 0x10FFFF. Η ord δεν επιστρέφει ποτέ αρνητικό αριθμό και δεν επιστρέφει ποτέ μη ακέραιο. Συμβουλεύεται μόνο τον πρώτο χαρακτήρα του ορίσματος - οι ακόλουθοι χαρακτήρες αγνοούνται. Για να διασχίσετε κάθε σημείο κώδικα μιας συμβολοσειράς, συνδυάστε με split // ή unpack "U*".

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

Χωρίς όρισμα, η ord διαβάζει το $_. Δεν διαβάζει ούτε γράφει καμία άλλη ειδική μεταβλητή. Η ερμηνεία της εισόδου ως χαρακτήρων (όχι bytes) εξαρτάται από το αν το βαθμωτό είναι εσωτερικά σημειωμένο ως UTF-8 - δείτε Οριακές περιπτώσεις παρακάτω.

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

Βασική αναζήτηση ASCII:

print ord("A");             # 65
print ord("0");             # 48
print ord("\n");             # 10

Η κενή συμβολοσειρά επιστρέφει μηδέν, σύμφωνα με τη σύμβαση «χωρίς πρώτο χαρακτήρα»:

print ord("");              # 0

Μορφή προεπιλεγμένου ορίσματος μέσα σε βρόχο while πάνω από το $_:

while (<STDIN>) {
    last if ord == 4;       # stop on EOT (Ctrl-D) as first char
    print;
}

Αποκωδικοποίηση ευρέος χαρακτήρα. Η ord βλέπει τον χαρακτήρα, όχι τα bytes:

use utf8;
print ord("é");             # 233        (U+00E9)
print ord("€");             # 8364       (U+20AC)
print ord("😀");            # 128512     (U+1F600)

Διάσχιση κάθε σημείου κώδικα σε συμβολοσειρά - χρήσιμο για αποσφαλμάτωση εκπλήξεων κωδικοποίησης:

use utf8;
my $s = "héllo";
print join(",", map { ord } split //, $s), "\n";
# 104,233,108,108,111

Ζευγαρώστε με την chr για no-op πλήρη κύκλο σε οποιονδήποτε μονό χαρακτήρα:

my $c = "Z";
print chr(ord($c)) eq $c ? "same\n" : "changed\n";   # same

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

  • Σημασιολογία χαρακτήρα έναντι byte: η ord επιστρέφει το σημείο κώδικα του πρώτου χαρακτήρα, που για βαθμωτό σημειωμένο ως UTF-8 δεν είναι το ίδιο με το πρώτο byte. Η ord("\x{100}") επιστρέφει 256, παρότι αυτός ο χαρακτήρας καταλαμβάνει δύο bytes στη μνήμη. Για να εξετάσετε αντ” αυτού το πρώτο byte, επιβάλετε σημασιολογία bytes:

    use bytes;
    print ord("\x{100}");       # 196   (first UTF-8 byte, 0xC4)
    no bytes;
    print ord("\x{100}");       # 256
    

    Καταφύγετε στο use bytes μόνο όταν χρειάζεστε γνήσια εξέταση σε επίπεδο bytes· είναι τοπική, χειρουργική pragma.

  • Μη-UTF-8 βαθμωτό που περιέχει υψηλά bytes: αν το βαθμωτό είναι απλή συμβολοσειρά bytes (χωρίς σημαία UTF-8) και το πρώτο του byte είναι 0xC4, η ord επιστρέφει 196, όχι 256. Το byte ερμηνεύεται ως Latin-1. Το αν ένα δεδομένο βαθμωτό είναι σημειωμένο ως UTF-8 εξαρτάται από τον τρόπο που χτίστηκε - use utf8 στον πηγαίο κώδικα, decode_utf8, στρώμα I/O :utf8, chr τιμής πάνω από 255, κ.ο.κ.

  • undef: η ord(undef) επιστρέφει 0 και, υπό use warnings, εκπέμπει Use of uninitialized value in ord.

  • Αριθμητικό όρισμα: η ord(65) πρώτα μετατρέπει το 65 σε συμβολοσειρά "65", και μετά παίρνει τον πρώτο χαρακτήρα - οπότε επιστρέφει ord("6") == 54, όχι 65. Αυτό ξαφνιάζει· αν έχετε ακέραιο και θέλετε να κάνετε πλήρη κύκλο μέσω χαρακτήρα, χρησιμοποιήστε πρώτα την chr ή παρακάμψτε εντελώς την ord.

  • Πολυχαρακτηρικό όρισμα: σημασία έχει μόνο ο πρώτος χαρακτήρας. Η ord("ABC") επιστρέφει 65· τα B και C δεν συμβουλεύονται ποτέ.

  • Σημεία κώδικα surrogate και μη-χαρακτήρα: η ord θα επιστρέψει χωρίς πρόβλημα 0xD800..0xDFFF ή 0xFFFE/0xFFFF αν αυτά εμφανιστούν στην είσοδο. Η Perl δεν αρνείται να τα αποθηκεύσει· η επικύρωση, αν χρειάζεται, είναι δουλειά του καλούντος.

  • Μέγιστη τιμή: σε τυπικό build, η ord μπορεί να επιστρέψει έως 0x7FFFFFFF (31-bit) για συμβολοσειρά παραγόμενη από chr τιμής σε αυτό το εύρος. Το πραγματικό κείμενο Unicode φτάνει στο ανώτατο όριο 0x10FFFF.

  • Προτεραιότητα: η μοναδιαία μορφή ord $x δεσμεύει στενότερα από το , αλλά χαλαρότερα από τους περισσότερους αριθμητικούς τελεστές, οπότε η ord $x + 1 αναλύεται ως ord($x) + 1, όχι ως ord($x + 1). Παρενθεσιοποιήστε όταν αμφιβάλλετε.

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

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

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

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

  • sprintf - χρησιμοποιήστε %c για μορφοποίηση ακεραίου ως χαρακτήρα του, ή %x / %04x για να αποτυπώσετε αποτέλεσμα ord σε δεκαεξαδικό

  • unpack - unpack "U*" για κάθε σημείο κώδικα συμβολοσειράς· unpack "C*" για κάθε byte

  • lc / uc - εφαρμόστε casefold σε χαρακτήρα πριν πάρετε το σημείο κώδικά του όταν θέλετε συγκρίσεις χωρίς διάκριση πεζών-κεφαλαίων

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