יסודות - לקיחת הפניות ושימוש בהן#

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

יצירת הפניה עם backslash#

שימו backslash לפני כל משתנה, ותקבלו סקלר המפנה אליו:

my @array = (1, 2, 3);
my %hash  = (APR => 4, AUG => 8);
my $n     = 42;

my $aref  = \@array;   # reference to the array
my $href  = \%hash;    # reference to the hash
my $sref  = \$n;       # reference to the scalar

הפניה היא עצמה סקלר. אתם יכולים להעתיק אותה, להעביר אותה, לאחסן אותה במבנה נתונים אחר, מבלי לגעת בדבר שעליו היא מצביעה:

my $copy   = $aref;    # two scalars, one underlying array
my @slots;
$slots[3]  = $href;    # hash reference stored as an array element
my $pulled = $slots[3];

גם $aref וגם $copy מצביעים על אותו מערך. שינוי המערך דרך אחד נראה דרך השני. להעתקת התוכן בפועל, ראו הפניות אנונימיות.

איך הפניה מודפסת#

המירו הפניה למחרוזת ותקבלו תג סוג בתוספת כתובת:

print "$aref\n";       # ARRAY(0x55d3c1a02b40)
print "$href\n";       # HASH(0x55d3c1a02be0)

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

שימוש בהפניה - צורת הסוגריים המסולסלים#

בכל מקום שבו יכולתם לכתוב שם משתנה, אתם יכולים לשים את ההפניה בסוגריים מסולסלים במקום. הכלל הוא מכאני:

פעולה על @array

אותה פעולה דרך $aref

@array

@{$aref}

scalar @array

scalar @{$aref}

$array[3]

${$aref}[3]

$array[3] = 17

${$aref}[3] = 17

for my $x (@array) { ... }

for my $x (@{$aref}) { ... }

האשים פועלים לפי אותה תבנית:

פעולה על %hash

אותה פעולה דרך $href

%hash

%{$href}

keys %hash

keys %{$href}

$hash{red}

${$href}{red}

$hash{red} = 17

${$href}{red} = 17

וסקלרים:

my $x   = 10;
my $ref = \$x;
print ${$ref};         # 10
${$ref} = 99;
print $x;              # 99

את הסוגריים המסולסלים אפשר בדרך כלל להוריד כאשר מה שבתוכם הוא משתנה סקלר פשוט: @$aref פירושו זהה ל־@{$aref}, ו־$$sref פירושו זהה ל־${$sref}. התחילו עם הצורה המסולסלת עד שהצורה הקצרה תפסיק להיראות עמומה; $$hash{key} ו־${$hash}{key} שניהם עובדים, אך $$table{$country}[0] קל יותר לקרוא לא נכון מאשר ${$table}{$country}[0].

שימוש בהפניה - צורת החץ#

הדבר הנפוץ ביותר שאתם עושים עם הפניה הוא להוציא אלמנט אחד מהמערך או ההאש שעליהם היא מצביעה. הצורה המסולסלת עובדת (${$aref}[3]) אך קשה לקריאה. צורת החץ היא הקיצור:

$aref->[3]             # same as ${$aref}[3]
$href->{red}           # same as ${$href}{red}

החץ אינו קוסמטי. הוא הדבר המבחין בין שתי משמעויות שונות:

$aref->[3]             # fourth element of the array $aref points at
$aref[3]               # fourth element of the unrelated array @aref

$aref ו־@aref הם משתנים נפרדים, ללא קשר כמו $x ו־@x. שכחת החץ שולפת בשקט ממערך אחר שכנראה אינו קיים. ריצה תחת use strict הופכת את הטעות לשגיאת זמן הידור במקום תשובה שגויה שקטה בזמן ריצה.

שאילת מה שהפניה מצביעה עליו#

ה־built-in ref מחזיר מחרוזת המתארת את סוג הישות המוצבעת:

ref $aref              # ARRAY
ref $href              # HASH
ref $sref              # SCALAR
ref \&printer          # CODE
ref $n                 # empty string - $n isn't a reference

שלבו עם הקשר בוליאני כדי לבדוק ״האם זוהי הפניה?״:

if (ref $maybe) {
    # it's a reference of some kind
}
if (ref $maybe eq 'ARRAY') {
    # it's specifically an array reference
}

ראו ref לרשימה המלאה של מחרוזות ההחזרה (כולל CODE, GLOB, REF, Regexp, ושם החבילה כאשר ההפניה עברה bless למחלקה).

שתי טעויות מתחילים נפוצות#

  • טיפול בהפניה כמו במכולה הבסיסית. push $aref, 1 אינו דוחף לתוך המערך; זוהי שגיאת סוג. אתם חייבים לבצע dereference: push @{$aref}, 1 או (שווה־ערך) push @$aref, 1.

  • השמטת החץ בין משתנה ל־subscript שלו. $aref[3] אינו זהה ל־$aref->[3]. הראשון קורא מ־@aref, השני קורא דרך ההפניה.

לאן ממשיכים מכאן#

  • מערכים של מערכים - המקרה הדו־ממדי, וכלל החץ־בין־subscripts.

  • הפניות אנונימיות - [...] ו־{...} לבניית מבנים ללא ביניים בעלי שם.