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

ucfirst#

מחזיר עותק של מחרוזת כשהתו הראשון שלה במצב titlecase.

ucfirst לוקח מחרוזת, ממיר את התו הראשון שלה לצורת הtitlecase של Unicode, ומחזיר את התוצאה. כל תו אחר נשאר ללא־שינוי. המקור לעולם אינו משתנה. אם הארגומנט הושמט, ucfirst פועל על $_. Titlecase בדרך כלל מתלכד עם uppercase - "a" הופך ל־"A" - אך נבדל עבור מספר קטן של digraphs במערכות כתב המבחינות בין השניים (ראו מקרי קצה). אותם כללי פראגמה, locale, ודגל UTF-8 השולטים ב־lc וב־uc שולטים ב־ucfirst.

תקציר#

ucfirst EXPR
ucfirst

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

מחרוזת חדשה באותו אורך תווים כמו הקלט - רק התו הראשון משתנה. ערך ההחזרה הוא תמיד סקלר חדש; שינויו אינו משפיע על הארגומנט, ושינוי הארגומנט לאחר מכן אינו משפיע על המחרוזת המוחזרת. אורך הבייטים עשוי להשתנות בכמה בייטים אם לצורת ה־titlecase של התו הראשון יש קידוד UTF-8 שונה מהצורה המקורית שלו.

my $str = ucfirst("hello world!");   # "Hello world!"

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

  • קורא את $_ כאשר נקרא ללא ארגומנט.

  • צופה ב־use locale עבור LC_CTYPE - כש־locale בתוקף, טבלת ה־uppercasing של ה־locale הנוכחי חלה על תו ראשון שנקודת הקוד שלו מתחת ל־256.

  • צופה ב־use bytes - תחת use bytes רק a-z מובילים משתנים, ל־A-Z.

  • צופה ב־use feature 'unicode_strings' - אילוץ כללי Unicode ללא תלות בדגל ה־UTF-8 על הקלט.

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

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

  1. use bytes בתוקף - כללי ASCII. a-z מובילים ממופים ל־A-Z; כל בייט מוביל אחר נשאר כפי שהוא, כולל בייטים בטווח 128-255 שאחרת היו אותיות Latin-1.

  2. use locale עבור LC_CTYPE בתוקף - טבלאות ה־locale הנוכחי חלות על תו ראשון מתחת לנקודת קוד 256; תו ראשון ב־256 ומעלה (נגיש רק כשהמחרוזת כבר נושאת את דגל ה־UTF-8) משתמש בכללי Unicode. מ־Perl 5.20 ואילך, locale של UTF-8 משתמש בכללי Unicode מלאים לאורך כולו.

  3. לארגומנט יש דגל UTF-8 מוגדר - כללי titlecase של Unicode חלים על התו הראשון.

  4. use feature 'unicode_strings' או use locale ':not_characters' בתוקף - כללי titlecase של Unicode חלים על התו הראשון, ללא תלות בדגל ה־UTF-8.

  5. אחרת - כללי ASCII. תו מוביל מחוץ ל־a-z מוחזר ללא־שינוי, כולל אותיות lowercase של Latin-1 כמו à-þ.

התוצאה: אם אתם רוצים התנהגות Unicode צפויה בכל מחרוזת ללא תלות באופן בנייתה, הפעילו use feature 'unicode_strings' (או use v5.12 ומעלה, שמפעיל זאת עבורכם).

Titlecase מול uppercase#

עבור הרוב המוחלט של התווים, titlecase ו־uppercase הם אותה נקודת קוד - ucfirst("abc") ו־uc(substr("abc", 0, 1)) . substr("abc", 1) מפיקים תוצאות זהות. הם נבדלים רק עבור קומץ תווי Unicode שצורת ה־uppercase שלהם היא רצף של שתי אותיות גדולות אך צורת ה־titlecase שלהם היא אות גדולה־ואחריה־אות קטנה בודדת. הדוגמה הסטנדרטית היא ה־digraph הלטיני dz (U+01F3):

  • uppercase הוא DZ (U+01F1) - "DZ" מוצג כגליף גדול אחד.

  • titlecase הוא Dz (U+01F2) - "Dz", D גדולה ואחריה z קטנה.

ucfirst מחזיר titlecase, וזוהי הצורה הנכונה כאשר התו עומד בתחילת מילה בקפיטליזציה. uc על אותו תו ראשון היה מחזיר את צורת שתי־האותיות־הגדולות, שנקראת כאילו המילה כולה ב־caps.

דוגמאות#

uppercasing בסיסי של תו ראשון ב־ASCII:

my $s = ucfirst("hello, world!");     # "Hello, world!"

ברירת מחדל ל־$_:

for ("foo", "bar", "baz") {
    print ucfirst, "\n";              # Foo / Bar / Baz
}

תווי Unicode עוברים titlecase רק כשהכללים מאפשרים זאת:

use feature 'unicode_strings';
my $s = ucfirst("äpfel");             # "Äpfel"

ללא unicode_strings וללא דגל ה־UTF-8 על הקלט, תו ראשון לא־ASCII עובר ללא־שינוי:

my $bytes = "\xE4pfel";               # ä as a single Latin-1 byte
my $cap   = ucfirst $bytes;           # unchanged: "\xE4pfel"

ucfirst הוא מה שתומך ב־escape \u בתוך מחרוזות במירכאות כפולות:

my $str = "\uperl\E is great";        # "Perl is great"

קפיטליזציה לכל מילה - שלבו עם split, map, ו־join:

my $title = join " ", map { ucfirst lc $_ } split / /, "HELLO world";
# "Hello World"

Titlecase של digraph המבחין בין titlecase ל־uppercase:

use feature 'unicode_strings';
my $t = ucfirst("\x{01F3}xyz");        # "\x{01F2}xyz" - Dz, not DZ

מקרי קצה#

  • ארגומנט undef מעלה אזהרת uninitialized תחת use warnings ומחזיר את המחרוזת הריקה.

  • מחרוזת ריקה מחזירה את המחרוזת הריקה - אין תו ראשון לשינוי.

  • מחרוזת חד־תווית מתנהגת בדיוק כפי ש־uc היה מתנהג עבור אותו תו אחד תחת אותו מערך כללים, למעט במקרי ה־digraph המתוארים לעיל שבהם titlecase ו־uppercase נבדלים.

  • מספרים מומרים למחרוזת תחילה: ucfirst(42) מחזיר "42" - ה־"4" המוביל אינו תו עם case, אז דבר אינו משתנה.

  • רווחים או פיסוק מובילים אינם מדולגים. ucfirst(" hello") מחזיר " hello" - התו הראשון הוא הרווח, שאין לו צורת titlecase. אם צריך להוסיף קפיטליזציה לאות הראשונה, הסירו לא־אותיות מובילות תחילה או השתמשו ב־regex (s/\b(\w)/\u$1/).

  • LATIN SMALL LETTER SHARP S (U+00DF, ß) עובר titlecase ל־"Ss" תחת כללי Unicode מלאים - שינוי אורך הסותר את הערובה הרגילה של ״אותו אורך תווים״. תחת use locale ב־locale שאינו UTF-8, Perl משאיר את התו ללא־שינוי במקום לנחש, ומ־Perl 5.22 ואילך הדבר מעלה אזהרת locale.

  • Locale ודגל ה־UTF-8 מקיימים אינטראקציה: תחת use locale ב־locale שאינו UTF-8, תו ראשון מתחת ל־256 עוקב אחר ה־locale בעוד תו ראשון ב־256 ומעלה עוקב אחר Unicode. בפועל ucfirst נוגע אי־פעם רק בתו אחד, אז האינטראקציה עדינה יותר מאשר עבור lc / uc, אבל היא עדיין נצפית במחרוזות המתחילות בתווים של supplementary-plane.

  • משתנים שעברו tie מקבלים את ה־FETCH שלהם נקרא פעם אחת. ucfirst אינו משנה את הערך שעבר tie; הוא מחזיר סקלר פשוט (שלא עבר tie).

  • ucfirst הוא אופרטור אונרי בעל שם, לא אופרטור רשימה. ucfirst $a, $b מפוענח כ־(ucfirst $a), $b - רק $a עובר טרנספורמציה, ואופרטור הפסיק משליך את התוצאה. השתמשו בסוגריים או ב־map כשמתכוונים לעשות titlecase למספר מחרוזות:

    my @capped = map { ucfirst } @words;
    

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

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

ראו גם#

  • lcfirst - המקבילה ל־lowercasing; הופכת את התו הראשון לצורת ה־lowercase שלו

  • uc - uppercase לכל תו במחרוזת; השתמשו כשרוצים שהמחרוזת כולה תהיה בקפיטליזציה, לא רק האות הראשונה

  • fc - Unicode casefold, הבחירה הנכונה להשוואה ללא רגישות לאותיות גדולות וקטנות כשהקלט עשוי להכיל לא־ASCII

  • $_ - נושא ברירת המחדל ש־ucfirst קורא בקריאה ללא ארגומנט

  • use locale - שולט האם טבלאות locale או כללי ASCII/Unicode חלים על התו הראשון כשהוא מתחת לנקודת קוד 256

  • use feature 'unicode_strings' - אילוץ titlecasing מלא של Unicode ללא תלות בדגל ה־UTF-8 על הקלט