סקלרים ומחרוזות · פונקציות מספריות

hex#

מפרש מחרוזת כספרה הקסדצימלית ומחזיר את ערכה המספרי.

hex קורא את EXPR כרצף של ספרות הקסדצימליות - אופציונלית עם קידומת 0x או x - ומחזיר את המספר השלם שאותן ספרות מייצגות. אם EXPR מושמט, נעשה שימוש ב־$_. הפעולה המלווה, להפיכת מספר חזרה למחרוזת הקסדצימלית, היא sprintf עם הפורמט "%x" או "%X".

תקציר#

hex EXPR
hex                 # operates on $_

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

מספר אי־שלילי. hex עצמו לעולם אינו מחזיר ערך שלילי: אין לו מושג של סימן, הוא רק מפענח ספרות.

  • אם התוצאה נכנסת במספר שלם מקומי (בדרך כלל 64־ביט ללא סימן בבניית 64־ביט), תקבלו מספר שלם.

  • אם הערך המפוענח חורג מטווח זה, hex חוזר ל־double של IEEE 754. נפלטת אזהרה תחת use warnings ועלול לאבד דיוק עבור ערכים מעל 2**53.

להמרה בכיוון ההפוך:

sprintf "%x", 255            # "ff"
sprintf "0x%08X", 4096       # "0x00001000"

דוגמאות#

ספרות הקסדצימליות רגילות, עם או בלי הקידומת 0x:

print hex '0xff';            # 255
print hex 'ff';              # 255
print hex 'DEADBEEF';        # 3735928559

קווים תחתונים בין ספרות מותרים כמפרידים חזותיים, באותה דרך שליטרלים מספריים מתירים אותם:

print hex '1_0000';          # 65536
print hex 'cafe_f00d';       # 3405700109

פעולה על $_:

for ('10', '20', 'ff') {
    print hex, "\n";         # 16, 32, 255
}

נסיעה חזור של ערך דרך hex:

my $n = 0xC0FFEE;
my $s = sprintf "%x", $n;    # "c0ffee"
print hex $s;                # 12648430

ערכים העוברים את רוחב המספר השלם המקומי מזהירים ומחזירים מספר נקודה צפה:

use warnings;
my $big = hex 'ffffffffffffffffff';   # 19 'f's - too wide for u64
# "Integer overflow in hexadecimal number" warning
# $big is now an IEEE 754 double, with lost precision

מקרי קצה#

  • תווים שאינם הקסדצימליים מסיימים את הפענוח. התו הראשון שאינו ספרה הקסדצימלית, קו תחתון או קידומת מוכרת מסיים את הסריקה. תחת use warnings זה פולט Illegal hexadecimal digit '…' ignored:

    use warnings;
    print hex '1f garbage';    # 31, with a warning
    print hex '0xAZ';          # 10, with a warning on 'Z'
    
  • רווח מוביל אינו מדולג. בשונה מ־oct, hex מתייחס לרווח לבן כתו שאינו הקסדצימלי, ולכן רווח מוביל עוצר את הפענוח לפני שנראית ספרה כלשהי:

    print hex ' ff';           # 0
    
  • מחרוזת ריקה ו־undef מחזירות 0. EXPR ריק מניב 0 ללא אזהרה. undef חשוף מניב 0 ופולט את אזהרת ה־Use of uninitialized value הרגילה תחת use warnings.

  • אין טיפול בסימן. - או + מובילים הם תווים שאינם הקסדצימליים ומסיימים את הפענוח לפני ספרה כלשהי, כך ש־hex '-ff' מחזיר 0. כדי לפענח מחרוזת הקסדצימלית עם סימן, הסירו את הסימן בעצמכם:

    my $s = '-ff';
    my $n = ($s =~ s/^-//) ? -hex($s) : hex($s);   # -255
    
  • צורות קידומת. הקידומות המקובלות הן 0x, 0X, x ו־X. 0 בודד אינו קידומת - הוא ספרה. אין קידומת # או $.

  • גודל האותיות אינו רלוונטי עבור הספרות a-f ועבור אות הקידומת x.

  • מיקום קו תחתון. קו תחתון בודד יכול להקדים כל ספרה. שני קווים תחתונים רצופים, קו תחתון מוביל לפני הקידומת, או קו תחתון נסחב מסיימים את הפענוח כתווים שאינם הקסדצימליים.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • oct - מפענח מחרוזות עם בסיס מזוהה אוטומטית: 0x… כהקסדצימלי, 0b… כבינארי, 0… כאוקטלי, כל דבר אחר כעשרוני. השתמשו בה כאשר בסיס הקלט אינו ידוע מראש

  • sprintf - הכיוון ההפוך; "%x" / "%X" מעצבים מספר למחרוזת הקסדצימלית באותיות קטנות או גדולות, "%#x" מוסיף את הקידומת 0x, "%08x" מרפד באפסים לרוחב קבוע

  • printf - אותו עיצוב "%x", נכתב ישירות למטפל קובץ

  • pack - התבניות H (חצי־בית גבוה ראשון) ו־h (חצי־בית נמוך ראשון) ממירות בין מחרוזת ספרות הקסדצימליות לבתים בינאריים ארוזים; השתמשו בהן בעת העברת נתונים הקסדצימליים אל ומתוך פרוטוקול בינארי

  • unpack - ההיפוך של pack; עם "H*" הוא הופך מחרוזת בתים למחרוזת ספרות הקסדצימליות בקריאה אחת