סקלרים ומחרוזות

chr#

מחזיר את התו שנקודת הקוד שלו היא המספר הנתון.

chr לוקח מספר שלם אי־שלילי ומחזיר מחרוזת בת תו אחד המחזיקה את התו שבנקודת הקוד הזו בערכת התווים הנוכחית. chr(65) הוא "A" הן ב־ASCII והן ב־Unicode; chr(0x263a) הוא תו החיוך של Unicode . אם NUMBER מושמט, chr פועל על $_. הפעולה ההפוכה היא ord.

תקציר#

chr NUMBER
chr
chr($n)

מה מקבלים בחזרה#

מחרוזת באורך תו אחד. עם סמנטיקת Unicode - ברירת המחדל לכל נקודת קוד מעל 0x7f - אותו תו עשוי להיות מקודד פנימית כמספר בתים של UTF-8, כך ש־length מדווח 1 בעוד bytes::length יכול לדווח עד ארבעה. עבור נקודות קוד בטווח 0..127 התוצאה היא מחרוזת ASCII בת בית בודד והשניים מסכימים.

מצב גלובלי שהוא נוגע בו#

ללא ארגומנט, chr קורא את $_. הוא אינו כותב דבר. הפרגמה bytes משנה את מה ש־chr עושה עם קלט מחוץ לטווח או שלילי (ראו מקרי קצה); אף פרגמה או משתנה מיוחד אחר אינו משפיע עליו.

דוגמאות#

תו ASCII מנקודת הקוד שלו:

print chr(65);              # A
print chr(97), "\n";        # a

בניית מחרוזת מרשימה של נקודות קוד באמצעות map ו־join:

my @code = (72, 101, 108, 108, 111);
print join("", map { chr } @code), "\n";   # Hello

נקודת קוד של Unicode מעל טווח ה־ASCII - התוצאה היא תו אחד, ארבעה בתים בצורת ה־UTF-8 הפנימית שלה:

use utf8;
my $smiley = chr(0x263a);
print length($smiley);                       # 1
use bytes; print length($smiley);            # 3

נסיעה חזור עם ord - עבור כל תו בודד $c, הזהות chr(ord($c)) eq $c מתקיימת:

my $c = "Z";
print chr(ord($c)) eq $c ? "yes" : "no";     # yes

צורת ברירת־מחדל־ארגומנט בתוך לולאה על $_:

for (65, 66, 67) {
    print chr;                               # prints ABC
}

קלט שלילי מניב את תו ההחלפה של Unicode U+FFFD:

print chr(-1) eq "\x{fffd}" ? "repl" : "?";  # repl

מקרי קצה#

  • ארגומנט שברי: נקטם לכיוון אפס לפני החיפוש. chr(65.9) מחזיר "A".

  • מחרוזת לא־מספרית: מומרת על ידי כללי הכפיית־מספרית הרגילים, עם אזהרה תחת use warnings. chr("65abc") מחזיר "A".

  • chr(undef) מחזיר chr(0), את תו ה־NUL "\0", ומזהיר תחת use warnings על שימוש בערך לא מאותחל.

  • ערכים שליליים: מחוץ לפרגמה bytes, קלט שלילי מחזיר את תו ההחלפה של Unicode "\x{fffd}". תחת use bytes, נעשה שימוש בשמונת הביטים התחתונים של ערך השלם: chr(-1) מניב את הבית "\xff".

  • ערכים מעל 0x10ffff (נקודת הקוד המקסימלית של Unicode) עדיין מחזירים מחרוזת בת תו בודד תחת סמנטיקת ברירת המחדל, אך פולטים אזהרה Unicode non-character is illegal for interchange עבור טווחי הלא־תווים, ואזהרה Unicode surrogate U+... עבור טווח ה־surrogate 0xd800..0xdfff כשהמחרוזת מקודדת מאוחר יותר.

  • הטווח 128..255: תווים בטווח זה אינם מאוחסנים כברירת מחדל כ־UTF-8 פנימית, לתאימות לאחור עם מחרוזות בתים. הם משווים שווה לצורת הבית הבודד שלהם ולאותה נקודת קוד של Unicode; הייצוג הפנימי משנה רק בעת בדיקה עם bytes::length או באינטראקציה עם שכבות PerlIO.

  • chr לעולם אינו זורק שגיאה על כל קלט מספרי. שגיאות צצות רק כאזהרות, לעולם לא כחריגות.

  • אינו lvalue: chr מחזיר סקלר רענן. chr(65) = "B" הוא שגיאת תחביר.

הבדלים מהמקור#

תאימות מלאה עם Perl 5.42 המקורי.

ראו גם#

  • ord - הפעולה ההפוכה של chr: נקודת הקוד של התו הראשון של מחרוזת

  • sprintf - sprintf "%c", $n שקול ל־chr $n; השתמשו בו לשלב תו לתוך פורמט גדול יותר בבת אחת

  • pack - בניית מחרוזת רבת־תווים מרשימה של נקודות קוד בקריאה אחת (pack "U*", @code עבור Unicode, pack "C*", @code עבור בתים)

  • hex - פירסור מחרוזת hex לתוך השלם שאז מועבר ל־chr; משלים את chr בעת פענוח סימון U+XXXX

  • use bytes - פרגמה שמחליפה את chr לסמנטיקה מוכוונת־בתים עבור ערכים מחוץ ל־0..0x7f

  • perlunicode - רקע על האופן שבו Perl מאחסן ומשווה מחרוזות Unicode