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

uc#

להחזיר עותק של מחרוזת באותיות גדולות.

uc עובר על EXPR תו אחר תו ומחזיר מחרוזת חדשה שבה כל תו בעל גודל אותיות הוחלף במקבילתו באותיות גדולות. תווים שאין להם מיפוי לאותיות גדולות - ספרות, סימני פיסוק, אותיות שכבר גדולות, סמלים - מועברים ללא שינוי. אם EXPR מושמט, uc פועל על $_. הקלט לעולם אינו משונה; uc תמיד מחזיר מחרוזת טרייה.

uc היא הפונקציה הפנימית שמממשת את ה־escape \U במחרוזות במרכאות כפולות, כך ש־"\Ufoo\E" ו־uc("foo") מייצרים את אותה תוצאה.

תקציר#

uc EXPR
uc

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

מחרוזת סקלרית חדשה שמכילה את הגרסה באותיות גדולות של EXPR. האורך בתווים אינו משונה עבור כל האותיות בעלות גודל ב־Basic Multilingual Plane; כמה תווים מתקפלים לצורה ארוכה יותר תחת כללי Unicode (ראו מקרי קצה), כך שאורך הבתים ואורך התווים של התוצאה יכולים שניהם לגדול.

my $s = uc("Perl is GREAT");   # "PERL IS GREAT"

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

  • $_ - משמש כארגומנט משתמע כאשר EXPR מושמט.

  • locale LC_CTYPE - מתייעצים איתו כאשר use locale פעיל. uc אחרת מתעלם מהסביבה.

  • use bytes / use feature 'unicode_strings' / use locale - הפרגמות הלקסיקליות בתחום באתר הקריאה בוחרות איזה מערך של כללי casing להלן מיושם.

אילו כללים חלים#

uc בוחר באחד משלושה מערכי כללים על בסיס הפרגמות בתוקף והייצוג הפנימי של המחרוזת. הלוגיקה תואמת ל־lc בדיוק; טבלת המיפוי היא פשוט ההפוכה.

  • use bytes בתוקף - כללי ASCII. רק a-z משתנים, ל־A-Z בהתאמה. כל בית מחוץ ל־0x61..0x7A מועבר ללא שינוי, ללא תלות במה שהיה משמעו כ־Latin-1 או UTF-8. יש להשתמש בזה רק כאשר ביטלת במכוון את הטיפול ב־Unicode.

  • use locale עבור LC_CTYPE בתוקף - ה־locale הנוכחי שולט בנקודות קוד מתחת ל־256; כללי Unicode שולטים בשאר (האחרון נגיש רק אם למחרוזת יש דגל UTF-8 מוגדר). מ־v5.20 ואילך, locale של UTF-8 נותן כללי Unicode מלאים לכל המחרוזת. תחת locales שאינם UTF-8, שינויי גודל אותיות שחוצים את הגבול 255/256 אינם מוגדרים היטב, ומאז v5.22, מפעילים אזהרת locale. ראו perllocale.

  • למחרוזת יש דגל UTF-8 מוגדר - כללי Unicode.

  • use feature 'unicode_strings' או use locale ':not_characters' בתוקף - כללי Unicode, גם עבור מחרוזות בתים.

  • אחרת - כללי ASCII. כל דבר מחוץ ל־a-z מועבר ללא שינוי. זוהי ברירת המחדל ההיסטורית עבור מחרוזות שאין להן לא דגל UTF-8 ולא פרגמה לקסיקלית שמצטרפת ל־Unicode.

המסקנה המעשית: אם רוצים אותיות גדולות צפויות של Unicode עבור קלט שרירותי, יש לשים use feature 'unicode_strings'; (או use v5.12; מודרני או גבוה יותר) בראש הקובץ ולהפסיק לדאוג איזה ייצוג למחרוזת יש במקרה.

דוגמאות#

ASCII בסיסי:

my $s = uc("hello");           # "HELLO"

ארגומנט מושמט פועל על $_:

for ("alpha", "beta") {
    print uc, "\n";            # "ALPHA\n", "BETA\n"
}

\U במחרוזת במרכאות כפולות היא אותה פעולה:

my $s = "Perl is \Ugreat\E";   # "Perl is GREAT"

המרה לאותיות גדולות של Unicode תחת unicode_strings:

use feature 'unicode_strings';
my $s = uc("straße");          # "STRASSE"

ל־sharp s הגרמני אין אות גדולה תו־בודד ב־Unicode; הוא ממופה לרצף הדו־תווי SS. המחרוזת המוחזרת לכן ארוכה בתו אחד מהקלט.

אותיות יווניות קטנות הופכות לאותיות גדולות, כאשר תווים לא־משונים מועברים:

use feature 'unicode_strings';
my $s = uc("Καλημέρα, world!"); # "ΚΑΛΗΜΈΡΑ, WORLD!"

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

use bytes;
my $s = uc("héllo");           # "HéLLO" - only the ASCII letters change

מקרי קצה#

  • undef: uc(undef) מחזיר "" ומפעיל אזהרת uninitialized תחת use warnings. יש להגן על קלטים שעשויים להיות לא־מוגדרים אם האזהרה הזו חשובה.

  • מחרוזת ריקה: uc("") מחזיר "". ללא אזהרה.

  • מיפויים אחד־לרבים: מספר קטן של תווים מתרחבים למספר תווים בהפיכה לאותיות גדולות - המוכר ביותר הוא U+00DF (ß) ← SS, וההתרחבויות היווניות U+0390 / U+03B0. מחרוזת התוצאה ארוכה מהקלט במקרים אלה. אין להניח ש־length(uc($s)) == length($s).

  • Titlecase מול אותיות גדולות: uc אינו ממיר את האות הראשונה ל־titlecase. Titlecase היא קטגוריה נבדלת של Unicode; ucfirst מיישם אותה על התו הראשון ומשאיר את השאר בשקט.

  • תווים ללא גודל אותיות: ספרות, סימני פיסוק, רווחים, סמלים, ו־ideographs של CJK מוחזרים ללא שינוי. uc("42!") הוא "42!".

  • עדכון במקום אינו דבר: uc מחזיר ערך חדש; הוא לעולם לא משנה את הארגומנט שלו. כדי להפוך לאותיות גדולות במקום, יש להשים חזרה: $s = uc $s.

  • הקשר: uc הוא תמיד סקלרי. קריאה לו בהקשר רשימה עדיין מייצרת מחרוזת יחידה.

  • הפתעות מחרוזת־בתים / דגל־Unicode: מחרוזת שנבנתה מ־read ללא שכבת :utf8 אין לה דגל UTF-8, כך ש־uc ללא use feature 'unicode_strings' יחיל כללי ASCII גם אם הבתים הם UTF-8 תקפים. יש לפענח קודם, או להפעיל את הפרגמה, כדי לקבל את ה־casing שנראה שהבתים אמורים לקבל.

  • use locale ו־locales שאינם UTF-8 (v5.22+): שינויי גודל אותיות שהיו חוצים את הגבול 255/256 פולטים אזהרת Can't do uc("…") on non-UTF-8 locale ומחזירים את תו הקלט ללא שינוי.

הבדלים מ־upstream#

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

ראו גם#

  • lc - הפעולה ההפוכה; הופכת כל תו בעל גודל אותיות לאות קטנה באמצעות אותה בחירת כללים

  • ucfirst - להפוך לאות גדולה (titlecase) רק את התו הראשון של המחרוזת; לתבנית ucfirst . lc $rest עם מודעות ל־Unicode כאשר ממירים מילה שלמה ל־titlecase

  • lcfirst - להפוך לאות קטנה רק את התו הראשון

  • fc - casefolding של Unicode להשוואה ללא רגישות לאותיות; יש להשתמש בזה, לא ב־uc או ב־lc, בעת השוואת מחרוזות לשקילות

  • sprintf - ההמרה %s אינה מבצעת casefold; יש לשלב עם uc כאשר format זקוק לשדה באותיות גדולות

  • tr/// - המבנה tr/a-z/A-Z/ הופך לאותיות גדולות רק ASCII ומהיר יותר מ־uc עבור קלט מובטח־ASCII