tied#
מחזיר את העצם המגבה משתנה קשור.
tied מוסר לכם את אותה הפניה ש־tie החזיר במקור כאשר VARIABLE נקשר למחלקה. דרך אותה הפניה תוכלו לקרוא למתודות ישירות על מימוש ה־tie - לעקוף את הדיספאץ« הרגיל של FETCH / STORE - וזו הדרך שבה מחלקות tie חושפות פעולות נוספות שאין להן תחביר סקלר / מערך / האש טבעי. אם VARIABLE אינו קשור, tied מחזיר undef.
תקציר#
tied VARIABLE
מה מקבלים בחזרה#
הפניה לעצם ה־tie הבסיסי כאשר VARIABLE קשור, ו־undef כאשר אינו. ההפניה היא הערך המדויק המוחזר במקור על־ידי קריאת tie התואמת - אותה מחלקה, אותה זהות blessed - ולכן ref(tied $v) מציין את שם מחלקת ה־tie וקריאות מתודה עליה מבוצעות באופן רגיל:
my $obj = tied %hash;
$obj->flush if defined $obj;
השתמשו ב־defined (או בבדיקה בוליאנית, כשמחלקת ה־tie לעולם אינה blesses לחבילה עם overload לערך שקרי) כדי להבחין בין משתנה קשור ללא־קשור לפני קריאה למתודות על התוצאה.
הטריק של ״tie handle״#
tied היא הדרך הנתמכת היחידה לדבר עם מימוש ה־tie ישירות. כל מתודה על מחלקת ה־tie שאינה אחד הוואים הסטנדרטיים (FETCH, STORE, EXISTS, DELETE, CLEAR, FIRSTKEY, NEXTKEY, והמקבילים שלהם למערך / סקלר / מטפל) נגישה רק דרך העצם ש־tied מחזיר:
tie my %cache, 'My::LRU', size => 1024;
tied(%cache)->stats; # class-specific method, no hash syntax
tied(%cache)->evict_older_than(3600);
זה גם הדפוס לאינטרוספקציה - לשאול משתנה קשור ״למי אתה קשור?״ ללא הנחת ידע של אתר הקישור:
my $class = ref tied @array; # e.g. "Tie::File"
דוגמאות#
בדיקה בסיסית לקשירות:
tie my %h, 'My::Tied::Hash';
print defined(tied %h) ? "tied\n" : "not tied\n"; # tied
קריאה למתודה ספציפית למחלקה דרך עצם ה־tie:
tie my @log, 'Tie::File', 'app.log' or die $!;
tied(@log)->flock(2); # LOCK_EX; Tie::File API
# ... mutate @log ...
tied(@log)->flock(8); # LOCK_UN
סקלר, מערך, האש, או מטפל קובץ רגילים שמעולם לא נקשרו:
my $x;
print defined(tied $x) ? "yes" : "no", "\n"; # no
tied אינו מבטל את הקשירה - המשתנה נשאר קשור לאחר הקריאה, וקריאות עוקבות מחזירות את אותה הפניה:
tie my $t, 'My::Counter';
my $a = tied $t;
my $b = tied $t;
print $a == $b ? "same\n" : "different\n"; # same
נסיעה חזור דרך ref ללמוד את מחלקת ה־tie:
tie my %db, 'DB_File', 'data.db', O_RDWR | O_CREAT, 0644;
print ref tied %db, "\n"; # DB_File
מקרי קצה#
אינו קשור: מחזיר
undef. אין אזהרה, אין חריגה. זוהי הדרך האידיומטית לבדוק האם משתנה קשור בכלל - אין פונקציה מובניתis_tiedנפרדת.מטפלי קובץ:
tied *FHמחזיר את העצם עבור מטפל קובץ קשור (נקשר עםtie *FH, ...). glob שמעולם לא נקשר מניבundefכמו כל משתנה לא־קשור אחר.tiedאינו מבטל את הקשירה. הוא accessor טהור. כדי לשחרר את הקישור, קראו ל־untie. החזקת ההפניה המוחזרת על־ידיtiedמעבר לנקודה שבה המשתנה לא־נקשר שומרת את עצם ה־tie חי, וזה מכוון - זו הדרך שבה אזהרות ה־untieעל ״untie attempted while N inner references still exist״ מופעלות.איבר קשור של אגרגט: כאשר איבר מערך או האש בודד הוא עצמו קשור (נפרד מ־tie על המכל),
tied $array[0]אוtied $hash{key}מחזירים את העצם לכל־איבר, לא את זה של המכל. tie של מכל ו־tie של איבר הם קישורים בלתי־תלויים.ערכים מועתקים אינם קשורים.
my $copy = $tied_scalar;ממיר למחרוזת דרךFETCH;$copyהוא סקלר רגיל ו־tied $copyמחזירundef. Tie הוא תכונה של המשתנה, לא של הערך.הפניות למשתנים קשורים משמרות את ה־tie.
\%hashהיכן ש־%hashקשור עדיין מתייחס למכל הקשור, ולכןtied %{ $ref }מחזיר את אותו עצם tie.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
tie- קושר משתנה למחלקה; מקים את יחס ה־tie ש־tiedמתשאלuntie- משחרר את ה־tie; לאחר קריאה אליו,tiedעל אותו משתנה מחזירundefref- קבלת שם המחלקה של העצם המוחזר על־ידיtiedללא קריאת מתודה נפרדתbless-tiedמחזיר הפניה blessed כאשר מחלקת ה־tie ביצעה bless לעצם שהחזירה מהבנאיTIE*שלהdefined- הבדיקה הסטנדרטית ל־״האם המשתנה הזה קשור?״ היאdefined tied $var