אופרטורי מציין־מקום ופרוסה#

משפחת הסוגריים־המרובעים־והמסולסלים שבוחרת אלמנטים מתוך מערכים והאשים - ומשפחת הסוגריים־המסולסלים־ל־deref שעושה את אותו הדבר דרך הפניה.

צורה

בוחר

מכל

טיפוס תוצאה

$arr[i]

אלמנט אחד

מערך

scalar

$hash{key}

אלמנט אחד

האש

scalar

@arr[i, j, k]

אלמנטים רבים (פרוסה)

מערך

רשימה

@hash{k1, k2}

אלמנטים רבים (פרוסה)

האש

רשימה

%arr[i, j, k]

פרוסת מפתח/ערך

מערך

רשימה (k,v…)

%hash{k1, k2}

פרוסת מפתח/ערך

האש

רשימה (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, ניתן להשמיט את ה־->. ראו חץ.

ראו גם#

  • חץ - ->[] ו־->{} למעבר דרך הפניה; כלל השמטת־החץ.

  • השמה - השמת פרוסה; פירוק רב־יעדים.

  • exists, delete - צורות perlfunc שלוקחות ביטוי מציין־מקום.

  • keys, values - צורות מכל־שלם; אופרטורי הפרוסה הם הצורות החלקיות.

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