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

fc#

החזרת צורת ה־casefold לפי Unicode של מחרוזת לצורך השוואה ללא רגישות לאותיות גדולות וקטנות.

fc הוא פעולת המחרוזת המניעה השוואת שוויון מחרוזות ללא רגישות לאותיות גדולות וקטנות. הוא מפיק צורה של המחרוזת שבה הבחנות בין רישיות נמחקו, כך ששתי מחרוזות נחשבות שוות ללא רגישות לרישיות אם - ורק אם - תוצאות fc שלהן זהות בית־בית. זוהי גם הפונקציה העומדת מאחורי רצף ה־escape \F במחרוזות בגרשיים כפולים.

תקציר#

use feature 'fc';           # or: use v5.16;

fc EXPR
fc                          # operates on $_
"\F...\E"                   # same casefold, inside a double-quoted string

fc שמור מאחורי שער התכונה fc. יש להפעיל אותו במפורש עם use feature 'fc', להכניס אותו דרך חבילת גרסה (use v5.16 או חדש יותר, use feature ':5.16'), או לקרוא לו במלוא ההסמכה כ־CORE::fc ללא כל פרגמה.

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

מחרוזת המכילה את צורת ה־casefold של EXPR. התוצאה היא מחרוזת חדשה; הארגומנט לעולם אינו משתנה. האורך עלול להשתנות - ביצוע casefold על "\x{1E9E}" (LATIN CAPITAL LETTER SHARP S) מתרחב בדרך כלל ל־"ss", שני תווים מאחד.

יש להתייחס לערך ההחזרה כאטום: הוא מפתח המתאים להשוואת שוויון, לא להצגה. fc("Hello") הוא "hello" עבור ASCII, אך במקרה הכללי הפלט אינו דבר שמציגים למשתמש.

מדוע לא lc או uc?#

הפיכה לאותיות קטנות והפיכה לאותיות גדולות אינן אמינות להשוואה ללא רגישות לרישיות. שתי האפשרויות הבאות שגויות:

lc($a) eq lc($b)            # Wrong
uc($a) eq uc($b)            # Also wrong

הן נכשלות על תווים שהמיפוי lower/upper שלהם אינו סימטרי - המפורסם ביותר הוא ה־sharp S הגרמני. lc("\x{1E9E}") הוא "\x{1E9E}" (אין צורה קטנה), אך uc("ß") הוא "SS". casefolding עוקף זאת על־ידי מיפוי שני הצדדים לצורת שוויון ייעודית:

fc($a) eq fc($b)            # Right

המקבילה מבוססת ה־regex שהייתה נכונה לפני ש־fc היה קיים:

$a =~ /^\Q$b\E\z/i

fc הוא הדרך הישירה, ללא regex, לקבל את אותה תשובה.

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

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

  • use locale - בתוך תחום use locale, casefolding של תווים החוצים את הגבול 255/256 מושבת (ראו מקרי קצה להלן עבור כלל U+1E9E).

  • use feature 'unicode_strings' - משפיע על fc באותה דרך שבה הוא משפיע על lc: מאלץ סמנטיקת Unicode מלאה על מחרוזות בתים שאחרת היו מטופלות תחת כללי 8 ביט מורשתיים.

דוגמאות#

שוויון ללא רגישות לרישיות, השימוש הקנוני:

use feature 'fc';
fc("Hello") eq fc("HELLO");             # true
fc("café")  eq fc("CAFÉ");              # true

ה־sharp S הגרמני - המקרה הקלאסי שבו lc ו־uc שניהם נכשלים אך fc מצליח:

use feature 'fc';
my $a = "straße";
my $b = "STRASSE";
fc($a) eq fc($b);                       # true
lc($a) eq lc($b);                       # false - "straße" ne "strasse"

שימוש ב־fc כמפתח האש לחיפוש ללא רגישות לרישיות:

use feature 'fc';
my %seen;
for my $word (@words) {
    $seen{ fc $word }++;                # groups "Foo", "FOO", "foo"
}

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

use feature 'fc';
for (@lines) {
    next unless fc eq "quit";           # matches "QUIT", "Quit", ...
    last;
}

בתוך מחרוזת בגרשיים כפולים באמצעות \F (אותה פעולה, בתוך השורה):

use feature 'fc';
my $name = "Alice";
my $key  = "\F$name\E";                 # "alice" - same as fc($name)

קריאה ללא פרגמת התכונה, במלוא ההסמכה:

my $folded = CORE::fc($input);          # works in any scope

מקרי קצה#

  • ללא ארגומנט: fc ללא ארגומנט מקפל את $_.

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

  • התכונה אינה מופעלת: fc EXPR ללא use feature 'fc' (או חבילת use v5.16+) הוא שגיאת זמן הידור - ה־parser אינו מזהה את fc כמילת מפתח. CORE::fc(EXPR) תמיד עובד.

  • האורך עלול להשתנות: casefolds מלאים עשויים להרחיב תו אחד למספר תווים. fc("\x{1E9E}") הוא "ss". לעולם אין להסתמך על length(fc $s) == length($s).

  • לא נסיעה חזור: fc הוא חד־כיווני. אין פעולת ”uncasefold“; הרישיות המקורית אבדה.

  • U+1E9E תחת use locale: fc של LATIN CAPITAL LETTER SHARP S (U+1E9E) מתקפל בדרך כלל ל־"ss". תחת use locale המיפוי הזה מודחק כי הוא חוצה את גבול נקודת הקוד 255/256, שכללי locale אינם מטפלים בו בצורה נקייה. במקום זאת fc מחזיר "\x{17F}\x{17F}" (שני LATIN SMALL LETTER LONG S). מאחר שכל long s בעצמו מתקפל ל־"s", שניים מהם משווים כשווים ל־U+1E9E בודד שקופל מחוץ לתחום ה־locale - כך שסמנטיקת השוויון נשמרת אף שצורת הבתים שונה.

  • טפסים תורכיים ו“פשוטים“ אינם מסופקים: Perl מממש רק את הצורה המלאה, הלא־תורכית של casefolding. עבור הצורה הפשוטה או הווריאנט התורכי, יש להשתמש ב־Unicode::UCD::casefold או במודול ה־CPAN Unicode::Casing.

  • לא זהה ל־NFKC או NFC: fc מוחק רישיות, לא הבדלי תאימות. fc("ffi") (LATIN SMALL LIGATURE FFI) הוא "ffi" לאחר קיפול, לא "ffi". יש לשלב עם Unicode::Normalize אם נדרשים שניהם.

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

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

ראו גם#

  • lc - הופך מחרוזת לאותיות קטנות; לשימוש בהצגה, לא להשוואה ללא רגישות לרישיות

  • uc - הופך מחרוזת לאותיות גדולות; אותה הסתייגות כמו lc

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

  • ucfirst - הופך לאותיות גדולות רק את התו הראשון

  • index - חיפוש תת־מחרוזת; יש לשלב עם fc על שני האופרנדים עבור וריאנט ללא רגישות לרישיות

  • $_ - ארגומנט ברירת המחדל כאשר EXPR מושמט