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*"για κάθε bytelc/uc- εφαρμόστε casefold σε χαρακτήρα πριν πάρετε το σημείο κώδικά του όταν θέλετε συγκρίσεις χωρίς διάκριση πεζών-κεφαλαίων$_- το προεπιλεγμένο όρισμα όταν ηordκαλείται χωρίς όρισμα