קלט/פלט

telldir#

מחזיר את מיקום הקריאה הנוכחי של מטפל ספרייה כטוקן אטום.

telldir מדווח היכן ה־readdir הבא על DIRHANDLE יחזור. הערך המוחזר הוא סימנייה, לא offset של בתים: מסרו אותו בחזרה ל־seekdir כדי לחדש איטרציה באותה רשומה, או השליכו אותו. למספר אין משמעות אריתמטית - הוא אינו אינדקס לתוך הספרייה, לא ספירת רשומות שנקראו, ולא בר־השוואה בין מטפלי ספרייה. התייחסו אליו כפי שהייתם מתייחסים לערך־ההחזרה של tell על מטפל קובץ: אטום לכם, משמעותי רק ל־seekdir התואם.

תקציר#

telldir DIRHANDLE

מה מקבלים בחזרה#

מספר שלם בהצלחה, undef בכישלון (לדוגמה, אם DIRHANDLE אינו מטפל ספרייה פתוח). המספר השלם מובטח לבצע נסיעה חזור דרך seekdir רק על אותו מטפל ספרייה פתוח; סגירה ופתיחה מחדש של הספרייה מבטלת כל טוקן שהוחזר קודם לכן.

opendir my $dh, $path or die "opendir $path: $!";
my $pos = telldir $dh;
# ... readdir a few entries ...
seekdir $dh, $pos;           # back to where $pos was taken

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

קובע את $! בכישלון.

דוגמאות#

סימון של מיקום, ואז חזרה אליו:

opendir my $dh, "." or die "opendir: $!";
readdir $dh;                 # consume "."
my $mark = telldir $dh;
my @rest = readdir $dh;      # drain the rest
seekdir $dh, $mark;
my @again = readdir $dh;     # same entries as @rest
closedir $dh;

רישום של טוקן לפני כל רשומה כדי שתוכלו לחזור אחורה צעד אחד:

opendir my $dh, $path or die "opendir $path: $!";
my $prev;
while (defined(my $entry = readdir $dh)) {
    last if $entry eq "STOP";
    $prev = telldir $dh;     # position *after* the current entry
}
seekdir $dh, $prev if defined $prev;

החזרה לאחור להתחלה עדיף לבצע עם rewinddir מאשר על־ידי זכירת הטוקן מלפני ה־readdir הראשון:

opendir my $dh, $path or die "opendir $path: $!";
my @first_pass  = readdir $dh;
rewinddir $dh;               # cleaner than seekdir $dh, $start_token
my @second_pass = readdir $dh;

בדיקה לכישלון באופן מפורש כאשר המטפל עלול להיות סגור:

my $pos = telldir $dh;
defined $pos or die "telldir failed: $!";

מקרי קצה#

  • הטוקן אטום. אל תשוו, תוסיפו, תפחיתו, או תשמרו את הערך. הוא תקף רק עבור seekdir על אותו מטפל ספרייה פתוח באותו תהליך.

  • לא פורטבילי בין מטפלים. שתי קריאות opendir על אותה ספרייה מפיקות מטפלים בלתי־תלויים; טוקן מאחד הוא חסר משמעות לאחר.

  • לא יציב על־פני closedir / opendir. פתיחה מחדש של הספרייה מתחילה איטרציה רעננה; טוקנים ישנים אינם מתייחסים יותר לדבר.

  • דחיסת ספרייה. אם מערכת הקבצים הבסיסית או תהליך אחר משנים את הספרייה (מוסיפים, מסירים, או משנים שמות של רשומות) בין telldir ל־seekdir התואם, המיקום המחודש עלול לדלג על רשומות, לחזור על רשומות, או לנחות על רשומה שונה מזו שסומנה במקור. זוהי תכונה של זוג telldir(3) / seekdir(3) של ספריית ה־C, ואין זה משהו ש־Perl מטשטש מעליו. צלמו את הספרייה עם readdir לרשימה אם אתם צריכים יציבות.

  • מטפל סגור או שלא נפתח מעולם. מחזיר undef וקובע את $!.

  • Bareword מול מטפל סקלר. telldir DH ו־telldir $dh שניהם פועלים. צורת ה־bareword היא גלובל של חבילה; צורת הסקלר מחזיקה הפניה למטפל ספרייה אנונימי שנוצר על־ידי opendir my $dh, ....

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • seekdir - הצרכן היחיד של טוקן telldir; משחזר את DIRHANDLE למיקום המסומן

  • readdir - האיטרטור שעל מיקומו telldir מדווח; מקדם את הסמן ש־telldir צופה בו

  • rewinddir - זול יותר מ־seekdir לטוקן תחילת־זרם כשרק רוצים לעבור על הספרייה שוב

  • opendir - יוצר את ה־DIRHANDLE ש־telldir מתשאל; כל טוקן telldir קשור לקריאת open אחת

  • closedir - מבטל כל טוקן telldir עבור המטפל

  • tell - האנלוג למטפל קובץ; אותו חוזה טוקן־אטום, קריאת מערכת בסיסית שונה