יסודות - לקיחת הפניות ושימוש בהן#
יש רק שתי דרכים ליצור הפניה למשהו שכבר יש לו שם, ורק שתי דרכים להשתמש בהפניה ברגע שיש לכם אותה. הפרק הזה מכסה את שתיהן. בנאים אנונימיים ([...], {...}) מכוסים ב־הפניות אנונימיות.
יצירת הפניה עם 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)
אם אי פעם תראו פלט כזה במקרה, הדפסתם את ההפניה במקום שבו התכוונתם להדפיס את התוכן.
שימוש בהפניה - צורת הסוגריים המסולסלים#
בכל מקום שבו יכולתם לכתוב שם משתנה, אתם יכולים לשים את ההפניה בסוגריים מסולסלים במקום. הכלל הוא מכאני:
פעולה על | אותה פעולה דרך |
|---|---|
|
|
|
|
|
|
|
|
|
|
האשים פועלים לפי אותה תבנית:
פעולה על | אותה פעולה דרך |
|---|---|
|
|
|
|
|
|
|
|
וסקלרים:
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.
הפניות אנונימיות -
[...]ו־{...}לבניית מבנים ללא ביניים בעלי שם.