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

oct#

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

השם מטעה: oct הוא בעצם parser של radix-prefix. הוא בוחן את התווים המובילים של EXPR ובוחר מהם את הבסיס - 0x/x להקסדצימלי, 0b/b לבינארי, 0o/o (או ללא תחילית בכלל) לאוקטלי. אם EXPR מושמט, oct פועל על $_. יש לחשוב עליו כעל ההפך של sprintf "%o" / "%x" / "%b" עבור המקרה הנפוץ שבו יש את הצורה הטקסטואלית ונדרש המספר.

תקציר#

oct EXPR
oct                 # operates on $_

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

מספר שלם לא־שלילי. הערך המספרי של EXPR מפורש בכל בסיס שהתחילית שלו בחרה (אוקטלי כברירת מחדל). התוצאה היא תמיד >= 0 - oct אינו מפענח סימן מוביל ואינו מחזיר ערכי נקודה צפה.

מחרוזת ריקה, מחרוזת ללא ספרות מזוהות, או undef מחזירים 0.

כללי תחילית#

התווים המובילים של EXPR (לאחר רווח מוביל כלשהו, שמדולג בשקט) קובעים את הבסיס:

תחילית

בסיס

קלט לדוגמה

תוצאה

0x או x

16 (הקס)

"0xff"

255

0b או b

2 (בינארי)

"0b1010"

10

0o או o

8 (אוקטלי)

"0o755"

493

(אין)

8 (אוקטלי)

"755"

493

(אין, 0 מוביל)

8 (אוקטלי)

"0755"

493

התחילית האוקטלית 0o/o נוספה ב־Perl 5.33.5 כדי להתאים לתחביר literal של מספרים שלמים; צורות ישנות יותר (0755 ו־755 חשוף) תמיד היו אוקטליות.

מתעלמים מ־underscores בין ספרות, כך שערכים שהועתקו ישירות מ־literals של מספרים שלמים ב־Perl מנותחים בצורה נקייה:

oct("0xDEAD_BEEF")      # 3735928559
oct("0b1111_0000")      # 240
oct("07_55")            # 493

דוגמאות#

לפענח מחרוזת הרשאה שמשתמש הקליד - כל הסיבה ש־oct קיים. המחרוזת "755" אינה המספר 755; היא הייצוג האוקטלי של המספר 493. chmod מצפה למספר:

my $mode = "0755";
chmod oct($mode), "script.sh";          # chmod 0755
my $mode = "755";                       # no leading zero - still octal
chmod oct($mode), "script.sh";          # same result

לפענח literals של hex ובינארי שנקראו מקובץ תצורה או משורת פקודה:

my $mask  = oct("0xff00");              # 65280
my $flags = oct("0b1010_0101");         # 165

לטפל במחרוזות בעלות תחילית radix שרירותית - עשרוני, אוקטלי, hex, או בינארי - בביטוי אחד. זהו המבנה הקלאסי של oct-כ־dispatcher: 0 מוביל (בכל אחת מצורותיו) משמעו ״לא־עשרוני״, אז יש לנתב דרך oct; אחרת לשמור את הערך כפי שהוא:

my $n = $val =~ /^0/ ? oct($val) : $val;

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

my @perms = map { oct } @mode_strings;

מעבר הלוך־ושוב עם sprintf לכיוון הנגדי:

my $perm = (stat $file)[2] & 07777;
my $text = sprintf "%o", $perm;         # e.g. "644"
my $back = oct($text);                  # back to the same integer

מקרי קצה#

  • קלט ריק או undef: oct("") ו־oct(undef) שניהם מחזירים 0. undef מפעיל אזהרת uninitialized תחת use warnings.

  • ללא תחילית ברירת המחדל היא אוקטלי: oct("12") הוא 10, לא 12. זוהי הפתעה תכופה - אם המחרוזות שלך עשויות להיות עשרוניות, יש לבדוק 0 מוביל קודם (ראו את המבנה לעיל) או לא להשתמש ב־oct כלל ולפענח במפורש.

  • מתעלמים מ־underscores בכל מקום שהם מופיעים בין ספרות. oct("0x_de_ad") הוא 57005. underscores מובילים וסיומיים גם הם מתקבלים בשקט.

  • תווים לא־תקפים מסיימים פענוח: הפענוח נעצר בתו הראשון שאינו שייך לבסיס הנבחר; שאר המחרוזת מושלך ללא אזהרה. oct("0x1g2") מחזיר 1, oct("755.5") מחזיר 493, oct("12abc") מחזיר 10 (אוקטלי, נעצר ב־a), oct("0b102") מחזיר 2 (בינארי 10, נעצר ב־2).

  • רווח מוביל מדולג בשקט. + או - מוביל אינו סימן - הוא לא־ספרה, אז הפענוח מחזיר 0. oct אינו יכול לייצר מספר שלילי.

  • רישום נקודה צפה ומעריך אינם מובנים. אין תמיכה ב־0x1.8p3; ה־. מסיים את הפענוח.

  • גודל אותיות של תחילית וספרות אינו רגיש: 0X, 0B, 0O, וספרות hex a-f/A-F כולם מתקבלים.

  • הצפה: ערכים גדולים יותר מהמספר השלם של הפלטפורמה מקודמים בשקט לנקודה צפה, מאבדים דיוק בסדר נמוך עבור קלטי hex/בינארי גדולים מאוד.

הבדלים מ־upstream#

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

ראו גם#

  • hex - מאלץ בסיס 16 ללא תלות בתחילית; יש להשתמש בו כאשר הקלט הוא תמיד hex ואין רצון בזיהוי האוטומטי של oct

  • int - לחתוך ערך מספרי לכיוון אפס; לא קשור לפענוח radix אך לעיתים פונים אליו בטעות

  • chmod - הצרכן הקנוני של oct; מקבל מצב מספרי, כך שמצבים בצורת מחרוזת חייבים לעבור דרך oct קודם

  • sprintf - הכיוון ההפוך: format %o, %x, %b הופכים מספר שלם לצורתו הטקסטואלית האוקטלית/הקס/הבינארית