qq//#
בניית מחרוזת במרכאות־כפולות עם שיבוץ, במתחם הנבחר.
qq// היא הצורה הארוכה של ליטרל המחרוזת "...". היא מפיקה את אותה מחרוזת ש־"" הייתה מפיקה, כך ש־qq/hello $name\n/ ו־"hello $name\n" ניתנים להחלפה. תכלית ה־qq היא המתחם: כשהתוכן מכיל " (או רצפי backslash שיפריעו למרכאות הכפולות), בוחרים מתחם אחר ושומרים על המחרוזת קריאה במקום לשרשר \" בתוכה.
תקציר#
qq/STRING/
qq{STRING}
qq(STRING)
qq[STRING]
qq<STRING>
qqXSTRINGX # any non-word, non-whitespace char works as delimiter
מה מוחזר#
מחרוזת סקלרית. משתנים המוזכרים בתוך משובצים בנקודה שבה qq// מוערך (לא בזמן פרסור); רצפי escape של backslash מורחבים. בתוצאה אין תו שורה חדשה מובלע - יש לכתוב \n בעצמכם.
בחירת מתחם#
כל תו שאינו תו מילה (/\w/) ואינו רווח לבן רשאי לבוא אחרי qq. ארבעת זוגות הסוגריים מקננים:
qq(foo (bar) baz) # "foo (bar) baz" - inner () balanced
qq{ if ($x) { 1 } else { 0 } }
qq[a[b[c]d]e]
qq<<a<b>c>>
מתחמים שאינם סוגריים משתמשים באותו תו בשני הקצוות ואינם מקננים:
qq|one|two| # SYNTAX ERROR - first | closes
qq/a\/b/ # "a/b" - backslash escapes the delimiter
אם המתחם הוא תו מילה, נדרש רווח לבן בין qq לבין המתחם:
qq XfooX # OK - "foo"
qqXfooX # WRONG - parsed as identifier qqXfooX
# כמתחם אינו צריך רווח ולעתים שימושי עבור מחרוזות המכילות כל סימן פיסוק אחר:
qq#He said "hi" & waved.# # "He said \"hi\" & waved."
התכונה extra_paired_delimiters (5.36+) מזהה קבוצה רחבה של זוגות סוגריים מ־Unicode כמתחמים מקננים; יש להפעיל אותה ב־use feature 'extra_paired_delimiters' כאשר רוצים, נאמר, גרשיים צרפתיים או סוגריי CJK.
מה משובץ#
סקלרים:
$x,$hash{key},$array[0],$ref->{k}[2].מערכים:
@arrמתרחב לפי הסדר, האיברים מאוחים על־ידי$"(ברירת מחדל" "). שקול ל־join $", @arr.פרוסות:
@h{qw(a b)},@a[1..3].הפניות חזרה עם חצים ותתי־סימון:
$ref->{key}[0].
מה לא משובץ:
קריאות מתודה:
$obj->methבתוךqq//משבץ את$objומשאיר את הטקסט המילולי->methבמחרוזת.קריאות פונקציה:
@{[ func() ]}הוא העקיפה הרגילה - הפניה־חזרה של הפניית מערך מריצה קוד שרירותי ומשבצת את התוצאה.מערכי פיסוק מלבד
@_,@+,@-: משובצים רק כשהם בסוגריים מסולסלים (@{*}).@*חשוף הוא@*מילולי.
my $obj = Some::Class->new;
qq/$obj->name/; # interpolates $obj, leaves "->name"
qq/@{[ $obj->name ]}/; # calls the method, interpolates result
רצפי escape#
זמינים בתוך qq// (ובכל מקום אחר שבו מתרחש שיבוץ):
רצף | משמעות |
|---|---|
| טאב (HT) |
| תו שורה חדשה (סוף שורה וירטואלי לפלטפורמה) |
| חזרת גררה (CR) |
| הזנת טופס (FF) |
| backspace (BS) |
| התראה / פעמון (BEL) |
| escape (ESC) |
| NUL |
| backslash מילולי |
| מרכאות כפולות מילוליות |
| תו הקסה, 0x00–0xFF |
| תו הקסה, כל נקודת קוד (צורה בסוגריים מסולסלים) |
| תו אוקטלי, כל נקודת קוד |
| תו אוקטלי, 000–777 (עדיף |
| תו בקרה - 64 ב־xor עם התו הבא באותיות גדולות |
| תו Unicode בעל שם (צריך |
| תו Unicode לפי נקודת קוד (תמיד Unicode, גם ב־EBCDIC) |
מתאמי רישיות וציטוט חלים עד \E או סוף המחרוזת:
רצף | משמעות |
|---|---|
| הופך לקטנה את התו הבא בלבד |
| הופך ל־titlecase (לא לאות גדולה!) את התו הבא בלבד |
| הופך לקטנות עד |
| הופך לגדולות עד |
| foldcase עד |
| ציטוט מטה־תווי regex עד |
| סיום ה־ |
\L, \U, \F, \Q מצטברים - כל אחד צריך \E משלו.
say "\u$name"; # capitalise first letter
say "\U$name\E's account"; # uppercase $name, rest untouched
say "match $file literally: \Q$file\E";
\Q בתוך qq// מוחל אחרי השיבוץ, כך ש־qq/\Q$pat\E/ שווה ל־quotemeta($pat). (באופרטורי ציטוט regex qr// ו־m//, \Q מוחל אחרי השיבוץ אך לפני הידור ה־regex - ההבדל משמעותי כאשר $pat עצמו מכיל מטה־תווי regex שרוצים לשמר מילוליים.)
ל־Perl אין escape של \v בליטרלי מחרוזת - זה מטה־תו regex. יש להשתמש ב־\x0b, \cK, או \N{VT} עבור טאב אנכי.
מצב גלובלי שהוא נוגע בו#
$"- מפריד הרשימה בשימוש בעת שיבוץ מערכים ופרוסות. ברירת מחדל" ". ניתן לשנות ב־local $" = ","לתחום אחד.
אף משתנה גלובלי אחר של המפרש אינו משתתף בהערכת qq// עצמה. משתנים משובצים הם כמובן כל ערכיהם הנוכחיים בנקודה שבה qq// רץ.
דוגמאות#
שיבוץ פשוט, זהה במשמעותו לצורת "...":
my $name = "world";
my $s = qq/hello, $name!\n/; # "hello, world!\n"
מחרוזת המכילה מרכאות כפולות - qq עם מתחם שונה נמנע מפסולת backslash:
my $msg = qq{He said "yes" and then "maybe".};
# vs: "He said \"yes\" and then \"maybe\"."
קטע HTML רב־שורתי עם סוגריים מסולסלים מקוננים - הזוג () מקנן:
my $user = "rj";
my $html = qq(
<p>Welcome, $user.</p>
<p>You have @{[ scalar @inbox ]} messages.</p>
);
שיבוץ מערך עם מפריד מותאם אישית:
my @tags = qw(perl rust docs);
local $" = ", ";
say qq/tags: @tags/; # "tags: perl, rust, docs"
מלכודת קריאת־מתודה - -> הוא מילולי בתוך qq//:
my $obj = File::Spec->new;
qq/path is $obj->rel2abs('.')/; # "path is <stringified $obj>->rel2abs('.')"
qq/path is @{[ $obj->rel2abs('.') ]}/;
# actually calls rel2abs()
בניית קטע SQL כאשר $ident אינו אמין - \Q..\E שומר על %, _, ו־backslash משובצים כמילוליים תחת פסוקית LIKE רק אחרי שטיפלתם בפרמטריזציה כראויה; עבור escaping של SQL בפועל יש להשתמש בציטוט של הדרייבר, לא ב־\Q:
my $needle = "100% sure";
my $pat = qq/\Q$needle\E/; # the regex-safe form
# $pat eq "100\\%\\ sure"
מתאמים מצטברים:
say qq/\Qfoo \ubar \Ubaz\E qux\E done/;
# "foo\ Bar\ BAZ qux done"
# \Q quotes spaces/?; \u titlecases b; \U uppercases baz until \E;
# outer \E ends \Q.
מקרי קצה#
בחירת מתחם בזמן פרסור. Perl בוחר את המתחם הסוגר ברגע שהוא קורא את הפותח.
qq/.../מצפה ל־/; אין דרך להחליף באמצע המחרוזת. אם נדרשים שני סוגי סוגריים, יש לבחור מתחם שאינו סוגר.backslash בסוף מחרוזת עם מתחם שאינו סוגר.
qq/a\/הואa/(ה־backslash עושה escape למתחם, המחרוזת ממשיכה); כדי לקבל backslash מילולי מסיים, יש להחליף מתחם:qq{a\\}.אין קינון למתחמים שאינם סוגרים.
qq|a|b|היא המחרוזתaואחריה המזההbואחריו|- שגיאת תחביר ברוב ההקשרים. יש לבחור מתחמי סוגריים כאשר התוכן מכיל את תו המתחם.#כמתחם הוא מקרה מיוחד רק בגלל איך הערות נכנסות לתמונה:qq#...#היא מחרוזת, אבלqq #...#(עם רווח לבן) הוא האופרטורqqואחריו הערה, כאשר המחרוזת נלקחת מהשורה הבאה. זה משקף את התנהגות כל האופרטורים ממשפחתq.מחרוזת ריקה.
qq//היא המחרוזת הריקה, זהה ל־"".undefמשובץ. מומר למחרוזת ריקה, ותחתuse warnings, מפעיל אזהרתuninitializedבנקודת השיבוץ, לא בנקודה שבה ל־$varהושםundef.$או@ואחריהם לא־מזהה. נשאר מילולי:qq/cost: \$5/ו־qq/cost: $5/שניהם מפיקיםcost: $5(אין משתנה בשם$5במובן מזהה Perl 5 -$5הוא לכידת regex, שכן קיימת, כך שהצורה השנייה משבצת את קבוצת לכידה 5, יהיה אשר יהיה ערכה כעת). עבור$או@מילולי, יש לבצע escape:\$,\@.\N{...}ללאcharnames. תווים בעלי שם דורשים ש־use charnames ':full'(או דומה) ייטען בתחום; בלעדיו מקבלים שגיאת זמן הידור.\N{U+HEX}והצורות בעלות־השם־היחיד שבסט:looseעובדות בלעדיו.מיפוי רישיות רגיש ל־locale. עם
use localeהכולל אתLC_CTYPE,\l,\u,\L,\Uמשתמשים בטבלאות הרישיות של ה־locale הנוכחי. בלעדיו, טבלאות הרישיות של Unicode בשימוש עבור נקודות קוד מעל 0xFF, וכללי ASCII מתחת.\Fמשתמש ב־foldcase של Unicode ללא קשר ל־locale (פרט ל־locale של UTF-8, שבו הוא תואם ל־\L).רמה אחת בלבד. תוצאת השיבוץ אינה נסרקת מחדש.
my $v = '$x'; qq/$v/היא המחרוזת$xבת ארבעת התווים, לא הערך של$x.
הבדלים מהמעלה־הזרם#
תאימות מלאה עם Perl 5.42 מהמעלה־הזרם.
ראו גם#
q//- ליטרל במרכאות יחידות, ללא שיבוץ, אותם כללי מתחםqw//- ליטרל של רשימת מילים, מפיק רשימת מחרוזות מפוצלות על רווח לבןqx//- מחרוזת משובצת המבוצעת כפקודת shell, לוכדת את stdoutqr//- regex משובץ, מהודר פעם אחת ורב־שימושיsprintf- יש להישען על כך כשהעבודה היא לפרמט מספרים או לרפד שדות, לא לשבץ משתנים בטקסטquotemeta- הפונקציה ש־\Q..\Eקוראת לה$"- מפריד הרשימה בשימוש כאשר מערך משובץ למחרוזת במרכאות־כפולותאופרטורי ציטוט ודמויי־ציטוט - הטבלה המלאה של
q,qq,qx,qw,qr,m,s,trוכללי המתחם וה־escape המשותפים להם