ביטויים רגולריים והתאמת תבניות
quotemeta#
מחזיר עותק של מחרוזת שבו כל תו משמעותי ל־regex מקבל escape של backslash, כך שהתוצאה ניתנת לשיבוץ לתבנית ולהתאים את התוכן המילולי שלה.
quotemeta קיים כדי לגשר בין נתוני מחרוזת לתחביר regex. כאשר קלט משתמש, שמות קבצים, או ערכי תצורה מגיעים לצד ימין של =~, כל תו שבמקרה הוא מטה־תו של regex (., *, +, ?, (, [, \, |, …) היה אחרת מפעיל את התנהגותו המיוחדת. quotemeta מקדים את זה על־ידי הוספת backslash לפני כל תו ASCII שאינו תו מילה, ומותיר אותיות, ספרות, וקו תחתון ללא שינוי.
תקציר#
quotemeta EXPR
quotemeta
מה מקבלים בחזרה#
מחרוזת חדשה. כל תו ASCII שאינו מתאים ל־/[A-Za-z_0-9]/ מוקדם על־ידי backslash; תווי מילה עוברים ללא שינוי. התוצאה תמיד בטוחה להדבקה ב־regex כקטע תבנית מילולי.
quotemeta הוא מייצר־ערך טהור - הוא אינו משנה את הארגומנט שלו.
my $safe = quotemeta 'a.b*c'; # 'a\.b\*c'
מצב גלובלי שהוא נוגע בו#
קורא את $_ כאשר הוא נקרא ללא ארגומנט. בתוך התחום של use locale, תווי Latin‑1 לא־ASCII נוספים מצוטטים כדי להגן מפני locales המתייחסים לפיסוק כמו | כתו מילה.
דוגמאות#
הצורה החשופה משתמשת בברירת המחדל $_, כמו רוב הפונקציות המובנות של רשימה:
for ('a+b', 'c.d') {
print quotemeta, "\n"; # a\+b
} # c\.d
שיבוץ קלט משתמש לתוך החלפה. בלי quotemeta, .*? ב־$substring היה פעיל ב־regex ומתאים הרבה יותר ממה שהתכוונתם:
my $sentence = 'The quick brown fox jumped over the lazy dog';
my $substring = 'quick.*?fox';
my $quoted = quotemeta $substring;
$sentence =~ s{$quoted}{big bad wolf};
# $sentence unchanged - the literal text 'quick.*?fox' is not present
ה־escape של \Q...\E במחרוזת דבל־קווט הוא בדיוק quotemeta המופעל על האזור המוקף. שתי הצורות להלן שקולות:
my $pat1 = "\Q$substring\E";
my $pat2 = quotemeta($substring);
בניית regex המתאים לשם קובץ מילולי בכל מקום בנתיב:
my $name = 'my.config[prod].ini';
if ($path =~ /\Q$name\E\z/) {
# matches exactly the filename, no metachar surprises
}
ביצוע escape לרשימת מונחים עבור חלופה:
my @terms = ('C++', 'C#', '.NET');
my $alt = join '|', map { quotemeta } @terms;
# 'C\+\+|C\#|\.NET'
מקרי קצה#
ללא ארגומנט:
quotemetaללא ביטוי מצטט את$_. בתוך לולאה כמוfor (@input) { push @safe, quotemeta }זו הצורה האידיומטית.מחרוזות שכבר בטוחות אינן נוגעות: קלט טהור של תווי מילה (
[A-Za-z0-9_]+) נוסע חזור באופן זהה.Backslashים מילוליים בתוך
\Q...\Eמקיימים אינטראקציה עם שיבוץ backslash מסוג דבל־קווט לפני ש־\Qרואה את הטקסט. רצף כמו"\Q\t\E"מצטט תו טאב מילולי, לא backslash שאחריוt. כאשר אתם צריכים backslashים בפועל באזור המצוטט, שמרו את הנתונים במשתנה והשתמשו ב־quotemeta $varבמקום להטמיע אותם בליטרל דבל־קווט.אין דרך להזריק
$או@מילוליים בתוך\Q...\E:\$מוגן הופך לרצף בן ארבעה תווים\\\$בפלט, ו־$לא־מוגן מתחיל שיבוץ סקלר לפני ש־\Qרץ. צאו מהאזור המצוטט כדי לשבץ sigilים.ציטוט מודע ל־Unicode (Perl 5.16+): על מחרוזות UTF‑8 - ועל מחרוזות בתים תחת
use feature 'unicode_strings'אוuse v5.12או מאוחר יותר - תווים לא־ASCII מצוטטים רק כאשר הם נושאים את תכונות ה־UnicodePattern_Syntax,Pattern_White_Space,White_Space,Default_Ignorable_Code_Point, אוGeneral_Category=Control. תווים ממחלקת מזהים (אותיות, סימנים, ספרות) נשארים לבד. זהו החוזה היציב: Perl מבטיח שכל מטה־תו עתידי של regex יוגדר עםPattern_Syntax, כך שמחרוזות בטוחות היום ישארו בטוחות.מחרוזות לא־UTF‑8 ישנות מחוץ לתחום
unicode_stringsמצטטות כל נקודת קוד עליונה של Latin‑1 (\x80–\xFF), לתאימות לאחור עם התנהגות לפני 5.16.ציטוט Locale: בתוך
use locale, כל נקודות הקוד הלא־ASCII של Latin‑1 מצוטטות בין אם המחרוזת היא UTF‑8 ובין אם לא. ציטוט בטווח ASCII אינו מושפע מ־locale.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
m- אופרטור ההתאמה;quotemetaקיים כדי להזין ליטרלים בטוחים לתבנית שלוqr- עצמי regex מהודרים;qr/\Q$var\E/היא הדרך הרגילה לקבע תבנית סביב מחרוזת מילוליתs- החלפה; האתר הנפוץ ביותר של escape בסגנוןquotemetaבתבנית שמשמאל\Qו־\E- זוג ה־escape מסוג דבל־קווט שהוא פשוטquotemetaעם תחביר שונה$_- קלט ברירת המחדל כש־quotemetaנקרא ללא ארגומנט