rewinddir#
מאפס מטפל ספרייה לתחילת רישומה.
rewinddir מחזיר את המיקום הנוכחי של DIRHANDLE חזרה לתחילת הספרייה, כך שקריאת readdir הבאה מחזירה שוב את הרשומה הראשונה. זהו בן־הזוג של מטפל־ספרייה ל־seek על מטפל קובץ: ללא פתיחה־מחדש, ללא סריקה־מחדש של ספריית האב - רק איפוס מיקום על המטפל הפתוח.
תקציר#
rewinddir DIRHANDLE
מה מקבלים בחזרה#
1 בהצלחה, 0 בכישלון (עם $! קבוע). כישלון הוא נדיר בפועל - הסיבה הרגילה היא מטפל שמעולם לא נפתח או שכבר נסגר. בדוק את ערך ההחזרה אם אכפת לך מאחד משני המקרים:
rewinddir $dh
or die "rewinddir failed: $!";
שימוש טיפוסי#
כבר סרקת ספרייה עם readdir ואתה רוצה לסרוק אותה שוב בלי לשלם על opendir נוסף:
opendir my $dh, $path or die "opendir $path: $!";
my @all = readdir $dh; # first pass: collect everything
rewinddir $dh; # back to the top
while (my $entry = readdir $dh) { # second pass: process one by one
next if $entry =~ /^\.\.?\z/;
process("$path/$entry");
}
closedir $dh;
תבנית נפוצה שנייה היא שימוש חוזר במטפל אחד על פני מספר סריקות עם מסננים שונים, היכן שפתיחה־מחדש תהיה מבזבזת או תיצור race מול שינויי ספרייה מקבילים:
opendir my $dh, $path or die $!;
my @perl = grep { /\.p[lm]\z/ } readdir $dh;
rewinddir $dh;
my @text = grep { /\.txt\z/ } readdir $dh;
closedir $dh;
מקרי קצה#
מטפל לא־פתוח או סגור: מחזיר
0וקובע את$!. תחתuse warningsתקבל גם אזהרתrewinddir() attempted on invalid dirhandle.שינויי ספרייה במהלך סריקה:
rewinddirאינו מובטח להציף רשומות שנוצרו (או להסתיר רשומות שהוסרו) לאחר ש־opendirחזר.rewinddir(3)שמתחת פועל על זרם הספרייה הממוטמן של הקרנל; האם סריקה ש־rewound תצפה ב־mkdir,unlinkאוrenameמקבילים באותה ספרייה תלוי במערכת הקבצים ובמערכת ההפעלה. אם דרוש לך snapshot רענן, בצעclosedirו־opendirשוב.לא seek למיקום שרירותי:
rewinddirמאפס לתחילה ולא יותר מזה. כדי לחזור למיקום אמצע־ספרייה שזכרת, השתמש ב־telldir/seekdirבמקום.סדר הרשומות לא־מצוין: rewind משחזרת את אותו זרם שהקרנל נתן לך, אך סדר הרשומות הוא מה שמערכת הקבצים מפיקה - לא ממוין, לא לפי סדר יצירה, לא הסדר שראית בפעם הקודמת על מטפל אחר. מיין במפורש אם הסדר חשוב.
ניידות:
rewinddirהיא קריאת POSIX. על פלטפורמות ללאrewinddir(3)עובד היא עשויה להיות ממומשת על־ידי סגירה ופתיחה־מחדש של הספרייה; ראה L<perlport/rewinddir> לרשימה ההיסטורית. ב־Linux (הפלטפורמה ש־pperl מכוון אליה) זו אינה דאגה.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
opendir- פותח ספרייה ומקבל את המטפל ש־rewinddirפועל עליוreaddir- קורא את הרשומה הבאה; ממשיך מאיפה ש־rewinddirהשאיר את הזרם (ההתחלה)closedir- משחרר את המטפל; שלב עםopendirכאשר סריקת rewind אינה מספיקה ודרוש לך snapshot רענן של הספרייהtelldir- רושם את המיקום הנוכחי כדי שתוכל לחזור אליו מאוחר יותרseekdir- משחזר מיקום שנלכד קודם לכן על־ידיtelldir;rewinddir $dhשקול ל־seekdir $dh, 0על מערכות תואמות, אךrewinddirהוא האיות הנייד