אופרטורי מציין־מקום ופרוסה#
משפחת הסוגריים־המרובעים־והמסולסלים שבוחרת אלמנטים מתוך מערכים והאשים - ומשפחת הסוגריים־המסולסלים־ל־deref שעושה את אותו הדבר דרך הפניה.
צורה | בוחר | מכל | טיפוס תוצאה |
|---|---|---|---|
| אלמנט אחד | מערך | scalar |
| אלמנט אחד | האש | scalar |
| אלמנטים רבים (פרוסה) | מערך | רשימה |
| אלמנטים רבים (פרוסה) | האש | רשימה |
| פרוסת מפתח/ערך | מערך | רשימה (k,v…) |
| פרוסת מפתח/ערך | האש | רשימה (k,v…) |
כמה כללים מכסים את כל שנים־עשר הצירופים.
ה־sigil מסמן את התוצאה, לא את המכל#
@arr הוא המערך; $arr[3] הוא אחד מהאלמנטים שלו. ה־sigil המוביל אומר לכם לאיזה סוג ערך אתם ניגשים - סקלר ($), רשימת ערכים (@), רשימת מפתח/ערך (%):
my @arr = (10, 20, 30, 40, 50);
$arr[2] # 30 - scalar (single element)
@arr[1, 3] # (20, 40) - list of values at those indices
%arr[1, 3] # (1 => 20, 3 => 40) - list of (index, value) pairs
my %h = (a => 1, b => 2, c => 3);
$h{a} # 1 - scalar
@h{'a', 'c'} # (1, 3) - list of values
%h{'a', 'c'} # (a => 1, c => 3) - list of (key, value) pairs
צורות ה־״%-slice״ (%arr[...], %hash{...}) הן תוספת של Perl 5.20 שמחזירה זוגות מפתח/ערך כרשימה. הן הכלי הנכון כשאתם רוצים עותק של חלק מהאש:
my %selected = %h{ qw(a c) }; # %selected = (a => 1, c => 3)
אינדקסים שליליים על מערכים#
אינדקסי מערך שליליים נספרים מהסוף:
$arr[-1] # last element
$arr[-2] # second-from-last
@arr[-3..-1] # last three elements as a slice
אינדקסים חיוביים מחוץ לטווח נקראים כ־undef. אינדקסים שליליים מחוץ לטווח (אחורה יותר מההתחלה) מעלים שגיאת זמן־ריצה קטלנית:
my @a = (1, 2, 3);
$a[10] # undef (with no warning)
$a[-10] # FATAL: Modification of non-creatable array value
# (the error wording reflects how the lookup is implemented)
פרוסה כ־lvalue#
גם פרוסות מערך וגם פרוסות האש הן יעדי השמה תקינים:
@arr[0, 2, 4] = ('A', 'C', 'E'); # set positions 0, 2, 4
@h{qw(a b c)} = (1, 2, 3); # set three hash keys
(@arr[0, 1], @arr[1, 0]) = ... # be careful: aliasing!
אתם יכולים להחליף אלמנטים באמצעות השמת פרוסה ללא משתנה עזר:
@arr[$i, $j] = @arr[$j, $i]; # swap two array elements
@h{$key1, $key2} = @h{$key2, $key1}; # swap two hash values
ציטוט אוטומטי של מפתח האש#
בתוך {} עבור מציינֵי־מקום של האש, מזהי bareword מצוטטים אוטומטית:
$h{name} # same as $h{'name'}
$h{first_name} # same as $h{'first_name'}
$h{1_2} # FATAL - not a valid bareword identifier
$h{"1_2"} # quote it explicitly
זוהי אחת הנוחויות האהובות ביותר (והגורמות־הכי־הרבה־באגים) של Perl. ההחלטה bareword־או־לא מתרחשת בזמן הפענוח על בסיס הטוקן המילולי; קבועים וערכים מחושבים אינם נהנים ממנה:
use constant KEY => 'name';
$h{KEY} # WRONG - this is the bareword "KEY", not the constant!
$h{KEY()} # use empty parens to force function-call evaluation
$h{+KEY} # or unary +, the canonical workaround
הצורה +KEY היא הדרך הקומפקטית ביותר לומר ״זה אינו bareword, העריכו אותו כביטוי״.
אינדקסי מערך: כפויי־מספר־שלם, ללא ציטוט אוטומטי#
אינדקסי [] מוערכים כביטויים ונכפים למספרים שלמים (בחיתוך כלפי אפס):
$arr[1.7] # $arr[1] - 1.7 truncates to 1
$arr["3"] # $arr[3] - string coerces to integer
$arr[$#arr] # last element ($#arr is last valid index)
התחביר $#arr בתוך מציינֵי־מקום הוא ניבי עבור ״אחרון״:
$arr[$#arr] # last
@arr[0..$#arr] # all of @arr (verbose; just write @arr)
@arr[1..$#arr] # all except first
ערבוב - גישה רב־ממדית#
ל־Perl 5 אין מערכים רב־ממדיים מובנים; נתונים מקוננים נבנים מהפניות:
my @grid = ([1,2,3], [4,5,6], [7,8,9]);
$grid[1][2] # 6 - chained subscripts on AoA
$grid[1]->[2] # same - the arrow is optional between subscripts
$grid[$y][$x]
החץ־שבין־מציינֵי־מקום מרומז על־ידי הדקדוק של Perl: כששני מציינֵי־מקום עוקבים זה אחר זה מיד בשרשרת deref, ניתן להשמיט את ה־->. ראו חץ.