אופרטורי פסיק#
שני אופרטורים, שניהם נכתבים עם פסיק - אחד מהם נכתב ״פסיק שמן״ עם =>. הם זהים תחבירית ברוב המיקומים אך נבדלים בכלל ה־bareword בצד שמאל.
אופרטור | נקרא | מה הוא עושה |
|---|---|---|
| פסיק | מפריד רשימה (בהקשר רשימה); השלכה־והנבת־הימני (בהקשר סקלר) |
| פסיק שמן | זהה ל־ |
בהקשר רשימה - בניית רשימות#
בהקשר רשימה הפסיק הוא מפריד אלמנטי־הרשימה:
my @items = (1, 2, 3, 4); # 4-element list
my @flat = (1, 2, (3, 4), 5); # (1,2,3,4,5) - lists flatten
my @kv = (a => 1, b => 2); # 4-element list: a, 1, b, 2
my %h = (a => 1, b => 2); # hash from key-value pairs
רשימות ב־Perl הן שטוחות - אין ערך של רשימה מקוננת. רשימה המוטמעת בתוך רשימה אחרת נעלמת: האלמנטים שלה פשוט הופכים לאלמנטים של הרשימה החיצונית. כדי לקבל מבנה מקונן אתם זקוקים להפניות (ראו את הדרכת ההפניות):
my @flat = (1, 2, (3, 4), 5); # (1,2,3,4,5) - 5 elements
my @nested = (1, 2, [3, 4], 5); # (1, 2, ARRAYREF, 5) - 4 elements
בהקשר סקלר - הפסיק הוא ״להשליך, ואז להחזיר את הימני״#
כשביטוי פסיק מאולץ להקשר סקלר - על־ידי השמה לסקלר, על־ידי scalar(...), על־ידי היותו התנאי של if - הוא מעריך כל אופרנד משמאל־לימין לצורך תופעות־לוואי, ואז מניב את ערך האופרנד הימני ביותר:
my $x = (1, 2, 3); # $x = 3 - but warn under
# `use warnings`: "Useless use of
# a constant in void context"
# for 1 and 2
my $r = (do_a(), do_b(), final_value()); # runs all three, returns
# the last value
שימוש זה נדיר ב־Perl מודרני - הניב בסגנון C for(init, init; cond; step, step) הוא המקום העיקרי שבו תיתקלו בו (ואפילו שם, מומלצים סוגריים סביב תת־ביטוי הפסיק).
=> - הפסיק השמן#
=> עושה את אותו הדבר כמו , ובנוסף מצטט אוטומטית את ה־bareword בצורת־מזהה שבצדו השמאלי:
my %h = (
name => "John", # 'name' auto-quoted
age => 30,
"key with spaces" => "...", # quote required for non-bareword
);
# Equivalent without =>, requiring explicit quoting:
my %h = (
'name', "John",
'age', 30,
'key with spaces', '...',
);
הציטוט האוטומטי חל רק כשהצד השמאלי הוא מזהה bareword תקין תחבירית - אותיות, ספרות, קווים תחתונים, המתחיל באות או בקו תחתון. צורות אחרות אינן מצוטטות אוטומטית:
( name => 1 ) # 'name' auto-quoted - fine
( "name" => 1 ) # already a string - fine
( $variable => 1 ) # $variable evaluated - fine
( 0+1 => 1 ) # numeric expression - fine
( -name => 1 ) # WRONG - looks like negative bareword;
# parses as -('name') which is the
# numeric negation of a string. Quote it.
( CONST => 1 ) # 'CONST' auto-quoted - does NOT call
# the constant CONST!
( CONST() => 1 ) # explicit empty parens - calls CONST
האינטראקציה עם קבועים היא ההפתעה הנפוצה ביותר - ראו גם את עמוד המציין־מקום על ציטוט אוטומטי של מפתחות האש, שיש לו אותה תבנית.
ניבים נפוצים#
# Function arguments - the comma is just the argument separator
some_function($arg1, $arg2, $arg3);
# Hash construction - fat-comma communicates "this is a key"
my %config = (
host => 'localhost',
port => 8080,
user => $ENV{USER},
);
# List literal - interchangeable
my @months = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/);
# Trailing comma - allowed and idiomatic for diff-friendly multi-line literals
my @list = (
"first",
"second",
"third", # trailing comma is fine
);
הפסיק הגורר הוא מכוון: הוא מאפשר לכם לצרף, להסיר, או לסדר מחדש אלמנטי רשימה מבלי לגעת בשורות הסובבות, מה שמתבטא ב־diffs נקיים יותר בבקרת גרסאות.
קדימות#
, ו־=> יושבים בשורה 20 - רופפים יותר מהשמה, הדוקים יותר רק מהלוגיים בצורת־מילה (and/or/not/xor) ומאופרטורי רשימה במיקומם הימני. זו הסיבה שרשימת השמות עובדת:
my $a = 1, my $b = 2; # WRONG: parses as (my $a = 1), my $b = 2
# - comma at outer level, not list assignment.
# $a is 1, $b is 2, but the warning is loud.
my ($a, $b) = (1, 2); # the right way: list assignment
ראו גם#
השמה - השמת רשימה מסתמכת על תפקיד הפסיק בהקשר רשימה.
מציין־מקום - ציטוט אוטומטי של
$h{name}, המקרה המקביל ל־name => ....use constant- התנגשות bareword/קבוע היא המכשול הקנוני של הפסיק השמן.הקשר - סיפור הרשימה־מול־הסקלר שמאחורי הסיבה ש־
,מציין שני דברים שונים.