ord#
מחזיר את נקודת הקוד של Unicode של התו הראשון של מחרוזת.
ord לוקח מחרוזת, מסתכל על התו הראשון שלה, ומחזיר את נקודת הקוד המספרית של אותו תו כשלם. שימו לב תו, לא בית - אם המחרוזת היא מחרוזת תווים רחבים המכילה את האות é (U+00E9), ord מחזיר 233, ללא קשר לכמה בתים é תופס בזיכרון. עבור המחרוזת הריקה, ord מחזיר 0. אם EXPR מושמט, ord פועל על $_.
לכיוון ההפוך - להפיכת נקודת קוד חזרה לתו - ראו chr.
תקציר#
ord EXPR
ord
ord($str)
מה מקבלים בחזרה#
שלם אי־שלילי. עבור קלט ASCII הוא בטווח 0..127; עבור קלט Latin-1 0..255; עבור מחרוזת Unicode כללית כל דבר עד 0x10FFFF. ord לעולם אינו מחזיר מספר שלילי ולעולם אינו מחזיר ערך לא־שלם. רק התו הראשון של הארגומנט נבדק - תווים גוררים מתעלמים מהם. כדי לעבור על כל נקודת קוד של מחרוזת, שלבו עם split // או unpack "U*".
מצב גלובלי שהוא נוגע בו#
ללא ארגומנט, ord קורא את $_. הוא אינו כותב ואינו קורא משתנה מיוחד אחר. הפרשנות של הקלט כתווים (לא בתים) תלויה האם הסקלר מסומן פנימית כ־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 רואה את התו, לא את הבתים:
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
מקרי קצה#
סמנטיקת תו לעומת בית:
ordמחזיר את נקודת הקוד של התו הראשון, שעבור סקלר עם דגל UTF-8 אינו זהה לבית הראשון.ord("\x{100}")מחזיר256, אף על פי שאותו תו תופס שני בתים בזיכרון. כדי לבדוק את הבית הראשון במקום זאת, אלצו סמנטיקת בתים:use bytes; print ord("\x{100}"); # 196 (first UTF-8 byte, 0xC4) no bytes; print ord("\x{100}"); # 256
פנו ל־
use bytesרק כשאתם זקוקים באמת לבדיקה ברמת הבית; זוהי פרגמה לוקלית וכירורגית.סקלר שאינו UTF-8 המכיל בתים גבוהים: אם הסקלר הוא מחרוזת בתים פשוטה (ללא דגל UTF-8) והבית הראשון שלו הוא
0xC4,ordמחזיר196, לא256. הבית מתפרש כ־Latin-1. האם סקלר נתון מסומן עם UTF-8 תלוי באופן שבו הוא נבנה -use utf8במקור,decode_utf8, שכבת קלט/פלט: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 אינו מסרב לאחסן אותם; ולידציה, אם דרושה, היא תפקיד הקורא.ערך מקסימלי: על בנייה סטנדרטית,
ordיכול להחזיר עד0x7FFFFFFF(31 ביט) עבור מחרוזת שהופקה על ידיchrשל ערך בטווח זה. טקסט Unicode בעולם האמיתי מגיע לכל היותר ל־0x10FFFF.קדימות: הצורה האונרית
ord $xנקשרת חזק יותר מ־,אך רפויה יותר מרוב האופרטורים האריתמטיים, אזord $x + 1מתפרסר כ־ord($x) + 1, לאord($x + 1). הוסיפו סוגריים בספק.
הבדלים מהמקור#
תאימות מלאה עם Perl 5.42 המקורי.
ראו גם#
chr- הפעולה ההפוכה; הופך נקודת קוד חזרה למחרוזת בת תו אחדsprintf- השתמשו ב־%cלפרמט שלם כתו שלו, או%x/%04xלרינדור תוצאתordב־hexunpack-unpack "U*"עבור כל נקודת קוד של מחרוזת;unpack "C*"עבור כל ביתlc/uc- בצעו casefold לתו לפני לקיחת נקודת הקוד שלו כשאתם רוצים השוואות חסרות־רישיות$_- ארגומנט ברירת המחדל כאשרordנקרא ללא אחד