רשימות

qw//#

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

qw// הוא אופרטור quote-like של זמן הידור, לא פונקציית זמן ריצה. הפענוח רואה qw(foo bar baz) ופולט את רשימת הקבועים ("foo", "bar", "baz") - שום פיצול לא קורה בזמן ריצה, והרשימה מורכבת פעם אחת ללא קשר לתדירות ביצוע הקוד. פנה אליו בכל מקום שבו אחרת היית מקליד רשימה של ליטרלי מחרוזת קצרים ופשוטים מופרדים בפסיקים: רשימות ייבוא, @ISA, @EXPORT, סטים של מפתחות האש, טבלאות שמות בדיקה.

תקציר#

qw(foo bar baz)
qw[foo bar baz]
qw{foo bar baz}
qw<foo bar baz>
qw!foo bar baz!
qw/foo bar baz/

כל תו לא־אלפאנומרי משמש כמתחם. ארבעת זוגות הסוגריים ((), [], {}, <>) מקננים; כל המתחמים האחרים לא.

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

רשימה של מחרוזות בהקשר רשימה - אלמנט אחד לכל רצף של תווים שאינם רווחים בגוף, כאשר רווחים מובילים וגוררים מושלכים ורצפי רווחים פנימיים מטופלים כמפריד יחיד.

בהקשר סקלר qw// מוערך לאלמנט האחרון של הרשימה, מה שכמעט אף פעם אינו מה שהמחבר התכוון. use warnings מסמן את שגיאות הקשר־הסקלר הנפוצות (ראה מקרי קצה).

דוגמאות#

רשימת ייבוא למודול - השימוש הקנוני:

use POSIX qw(setlocale localeconv strftime);

טבלאות @EXPORT / @EXPORT_OK / @ISA:

our @ISA     = qw(Exporter);
our @EXPORT  = qw(sum min max);

בניית האש קטן שבו כל מפתח ממופה ל־1 (סט):

my %is_keyword = map { $_ => 1 } qw(if unless while until for);
if ($is_keyword{$word}) { ... }

השוואת שלוש הדרכים לכתוב את אותה רשימה - פסיקים־ומרכאות, ציטוט־אוטומטי של פסיק־שמן, ו־qw//:

my @a = ("foo", "bar", "baz");                  # explicit strings
my @b = (foo => "1", bar => "2", baz => "3");   # fat comma only
my @c = qw(foo bar baz);                        # qw//

אתחול מערך עם הרבה טוקנים קצרים:

my @months = qw(
    Jan Feb Mar Apr May Jun
    Jul Aug Sep Oct Nov Dec
);

רשימת ארגומנטים מיקומית לפונקציה:

run_tests(qw(smoke integration regression));

מקרי קצה#

  • אין פסיקים בתוך הגוף. פסיק נלקח כחלק ממילה: qw(foo, bar) מניב את הרשימה דו־האלמנטית ("foo,", "bar"), לא שלושה אלמנטים. use warnings פולט Possible attempt to separate words with commas.

  • אין תחביר הערות. # הוא תו מילולי בתוך הגוף. qw(foo # comment\n bar) מכיל את המילה # ואת המילה comment. use warnings פולט Possible attempt to put comments in qw() list.

  • אין escapes של backslash. \ הוא מילולי - אינך יכול לעשות escape לתו רווח כדי לכלול אותו במילה, ואינך יכול \-escape את המתחם. use warnings פולט אזהרה עבור כל \ בגוף.

  • אין שיבוץ. qw($x @y) מפיק את שתי המחרוזות המילוליות "$x" ו־"@y". השתמש ב־("$x", @y) (או q()/qq()) כשאתה רוצה את ערך המשתנה.

  • רווחים הם המפריד היחיד. Tabs ושורות חדשות מפצלים מילים בדיוק כמו רווחים, ולכן רשימות qw(...) רב־שורתיות הן אידיומטיות לטבלאות ארוכות.

  • מילים עם רווחים מוטמעים הן בלתי־אפשריות. אם אתה צריך "hello world" כאלמנט יחיד, qw// הוא הכלי הלא־נכון - השתמש ב־("hello world", ...) עם מרכאות אמיתיות.

  • גוף ריק. qw() הוא הרשימה הריקה, שווה־ערך ל־().

  • הקשר סקלר מניב את האלמנט האחרון, לא את הספירה. עטוף ב־scalar(() = qw(...)) אם אתה באמת רוצה את הספירה, או השם תחילה למערך:

    my @w = qw(foo bar baz);
    print scalar @w;                 # 3
    
  • עמימות פענוח עם //. qw// משתמש ב־/ כמתחם בדיוק כמו m// ו־s///. בתוך הגוף, שום מטה־תווי regex אינם חלים - זה פיצול מחרוזת שטוח על רווחים. הדמיון החזותי ל־regex הוא סיכון קריאה, לא סמנטי.

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

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

ראו גם#

  • q// - מחרוזת מילולית במרכאות בודדות; אין שיבוץ, בניגוד ל־qq//

  • qq// - מחרוזת מילולית במרכאות כפולות עם שיבוץ מלא

  • qr// - מהדר ליטרל regex; חבר משפחת ה־// להתאמת תבניות

  • split - המקבילה בזמן ריצה כאשר רשימת המילים שלך אינה ידועה עד זמן ריצה: split(" ", $str) מתנהג כמעט בדיוק כמו qw// דינמי

  • join - הפעולה ההפוכה, מדביקה רשימה חזרה למחרוזת תחומה יחידה