סקלרים ומחרוזות · פונקציות מספריות
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 (לאחר רווח מוביל כלשהו, שמדולג בשקט) קובעים את הבסיס:
תחילית | בסיס | קלט לדוגמה | תוצאה |
|---|---|---|---|
| 16 (הקס) |
|
|
| 2 (בינארי) |
|
|
| 8 (אוקטלי) |
|
|
(אין) | 8 (אוקטלי) |
|
|
(אין, | 8 (אוקטלי) |
|
|
התחילית האוקטלית 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, וספרות hexa-f/A-Fכולם מתקבלים.הצפה: ערכים גדולים יותר מהמספר השלם של הפלטפורמה מקודמים בשקט לנקודה צפה, מאבדים דיוק בסדר נמוך עבור קלטי hex/בינארי גדולים מאוד.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
hex- מאלץ בסיס 16 ללא תלות בתחילית; יש להשתמש בו כאשר הקלט הוא תמיד hex ואין רצון בזיהוי האוטומטי שלoctint- לחתוך ערך מספרי לכיוון אפס; לא קשור לפענוח radix אך לעיתים פונים אליו בטעותchmod- הצרכן הקנוני שלoct; מקבל מצב מספרי, כך שמצבים בצורת מחרוזת חייבים לעבור דרךoctקודםsprintf- הכיוון ההפוך: format%o,%x,%bהופכים מספר שלם לצורתו הטקסטואלית האוקטלית/הקס/הבינארית