untie#
ניתוק הקישור בין משתנה למחלקה הקשורה אליו.
untie מהפך tie קודם: לאחר הקריאה, VARIABLE חוזר להיות סקלר, מערך, האש, או מטפל קובץ פשוט, וקריאות וכתיבות עוקבות נוגעות באחסון הגולמי במקום להיות מנותבות דרך ה־FETCH, STORE, וחבריהם של החבילה הקשורה. אם המשתנה אינו קשור, untie הוא no-op.
תקציר#
untie VARIABLE
מה מקבלים בחזרה#
מחזיר ערך אמת אם המשתנה היה קשור והקישור הוסר, שקר אחרת. ערך ההחזרה נבדק לעתים רחוקות - אתרי הקריאה יודעים האם הם מפרקים tie שהם עצמם הקימו.
כתופעת לוואי, אם החבילה הקשורה מגדירה מתודה UNTIE, היא מופעלת על העצם הקשור לפני שהקישור נשמט. UNTIE מקבל את העצם וספירה של כל הפניות פנימיות נדרשות שמוחזקות אליו (ראו מקרי קצה להלן).
מה הוא עושה#
איתור הקסם על
VARIABLEש־tieקודם התקין.אם החבילה הקשורה מספקת
UNTIE, קריאה לו על העצם.הסרת הקסם כך שהמשתנה חוזר לאחסון רגיל.
שחרור ההפניה של המפרש לעצם הקשור. העצם נהרס (מפעיל
DESTROYאם מוגדר) ברגע שאין הפניות אחרות אליו שנותרות.
לאחר untie, כל ערך ש־tied החזיר קודם עבור המשתנה הזה כבר אינו תואם לקישור חי.
דוגמאות#
קשירת האש, שימוש בו, ואז שחרורו:
use Tie::File;
tie my @lines, 'Tie::File', 'log.txt' or die $!;
push @lines, "new entry";
untie @lines; # flush and release
נסיעה חזור דרך tied - תפסו את העצם הבסיסי כדי שתוכלו לקרוא לו מתודה לא־קשורה, ואז השמיטו את הקישור:
my $obj = tied %cache;
$obj->flush;
untie %cache;
untie על משתנה שמעולם לא נקשר אינו מזיק:
my %h;
untie %h; # no-op, no warning
הוו UNTIE שרץ לפני שהקישור נעלם:
package My::Tied;
sub TIEHASH { bless {}, shift }
sub UNTIE { my ($self, $count) = @_;
warn "untie with $count outstanding refs" if $count }
# ...
tie my %h, 'My::Tied';
untie %h; # calls My::Tied::UNTIE($obj, 0)
מקרי קצה#
הפניות פנימיות נדרשות: אם קוד שמר את העצם שהוחזר על ידי
tieאוtiedבמקום שעדיין מחזיק אותו ברגע ש־untieרץ, Perl מנפיקuntie attempted while N inner references still exist
תחת
use warnings. הקישור מוסר בכל מקרה, אך אותן הפניות שמורות ממשיכות להצביע על העצם המנותק כעת. השמיטו את ההפניות האלה קודם, או קבלו שהן יראו עכשיו את העצם הלא־קשור בבידוד.קריאה ל־
untieעל משתנה לא־קשור היא no-op. אין אזהרה, אין שגיאה, אין קריאת מתודה.Tie של מטפל קובץ:
untie *FHמסיר את ה־tie שהותקן על ידיtie *FH, $class, .... ה־glob הבסיסי וכל descriptor אמיתי של קובץ מאחוריו אינם מושפעים -untieאינוclose.UNTIEהוא אופציונלי: אם החבילה הקשורה אינה מגדירה אחד, הקישור פשוט מוסר. אל תסתמכו עלUNTIEשירוץ; מחלקות קשורות רבות משמיטות אותו.סדר הריסה:
untieעצמו אינו קורא ל־DESTROY. העצם נהרס כאשר ה־refcount שלו מגיע לאפס, מה שעשוי להיות מיד לאחרuntie(אם דבר אחר אינו מחזיק אותו) או מאוחר יותר (אם הקורא שמר עותק מ־tied).משתנים קשורים שעברו local: tie שהותקן בתוך תחום על משתנה שעבר
localמבוטל אוטומטית כשהתחום יוצא; אינכם זקוקים ל־untieמפורש, וקריאה לאחד אינה מזיקה.
הבדלים מהמקור#
תאימות מלאה עם Perl 5.42 המקורי.
ראו גם#
tie- מתקין את הקישור ש־untieמסיר; מציג את הקבוצה המלאה של שמות מתודות הוו של tietied- שליפת העצם הקשור כעת למשתנה קשור, בדרך כלל ממש לפני קריאה ל־untieעליוbless-tieמבצע bless לעצם שניתן לו;untieאינו unbless, הוא רק מנתק את המשתנה ממנוref- בדיקה איזה סוג של הפניהtiedהחזיר לפני ההחלטה לבצעuntielocal- אלטרנטיבה תחומה־בתחום כשרוצים שה־tie ייעלם ביציאה מהבלוק ללאuntieמפורש