telldir#
Επιστρέφει την τρέχουσα θέση ανάγνωσης ενός handle καταλόγου ως αδιαφανές διακριτικό.
Η telldir αναφέρει από πού θα ξεκινήσει η επόμενη readdir στο DIRHANDLE. Η επιστρεφόμενη τιμή είναι ένας σελιδοδείκτης, όχι byte-offset: παραδώστε την πίσω στη seekdir για να συνεχίσετε την επανάληψη στην ίδια εγγραφή, ή αγνοήστε την. Ο αριθμός δεν έχει αριθμητική σημασία - δεν είναι θέση μέσα στον κατάλογο, ούτε μετρητής εγγραφών που διαβάστηκαν, ούτε συγκρίσιμος μεταξύ handles καταλόγων. Αντιμετωπίστε τον όπως θα αντιμετωπίζατε την τιμή επιστροφής της tell σε file handle: αδιαφανής για σας, ουσιαστική μόνο για την αντίστοιχη seekdir.
Σύνοψη#
telldir DIRHANDLE
Τι επιστρέφεται#
Έναν ακέραιο σε επιτυχία, undef σε αποτυχία (για παράδειγμα, αν το DIRHANDLE δεν είναι ανοιχτό handle καταλόγου). Ο ακέραιος εγγυάται πλήρη κύκλο μέσω της seekdir μόνο πάνω στο ίδιο ανοιχτό handle καταλόγου· το κλείσιμο και ξανα-άνοιγμα του καταλόγου ακυρώνει κάθε διακριτικό που επιστράφηκε προηγουμένως.
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;
Ελέγξτε ρητά για αποτυχία όταν το handle μπορεί να είναι κλειστό:
my $pos = telldir $dh;
defined $pos or die "telldir failed: $!";
Οριακές περιπτώσεις#
Το διακριτικό είναι αδιαφανές. Μη συγκρίνετε, προσθέτετε, αφαιρείτε, ή αποθηκεύετε διαρκώς την τιμή. Είναι έγκυρη μόνο για τη
seekdirπάνω στο ίδιο ανοιχτό handle καταλόγου εντός της ίδιας διεργασίας.Μη φορητό μεταξύ handles. Δύο κλήσεις
opendirστον ίδιο κατάλογο παράγουν ανεξάρτητα handles· ένα διακριτικό από το ένα είναι ανούσιο για το άλλο.Όχι σταθερό σε
closedir/opendir. Το ξανα-άνοιγμα του καταλόγου ξεκινάει φρέσκια επανάληψη· τα παλιά διακριτικά δεν αναφέρονται πια σε τίποτα.Συμπίεση καταλόγου. Αν το υποκείμενο σύστημα αρχείων ή άλλη διεργασία τροποποιήσει τον κατάλογο (προσθέσει, αφαιρέσει, ή μετονομάσει εγγραφές) μεταξύ της
telldirκαι της αντίστοιχηςseekdir, η ανανεωμένη θέση μπορεί να παραλείψει εγγραφές, να επαναλάβει εγγραφές, ή να προσγειωθεί σε διαφορετική εγγραφή από αυτή που αρχικά σελιδοποιήθηκε. Αυτό είναι ιδιότητα του ζεύγουςtelldir(3)/seekdir(3)της βιβλιοθήκης C και δεν είναι κάτι που η Perl καλύπτει. Πάρτε στιγμιότυπο του καταλόγου μεreaddirσε λίστα αν χρειάζεστε σταθερότητα.Κλειστό ή ποτέ-μη-ανοιγμένο handle. Επιστρέφει
undefκαι θέτει την$!.Bareword έναντι βαθμωτού handle. Και τα δύο
telldir DHκαιtelldir $dhδουλεύουν. Η μορφή bareword είναι καθολική σε επίπεδο πακέτου· η βαθμωτή μορφή κρατάει αναφορά σε ανώνυμο handle καταλόγου που δημιουργήθηκε απόopendir my $dh, ....
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
seekdir- ο μόνος καταναλωτής ενός διακριτικούtelldir· επαναφέρει τοDIRHANDLEστη σελιδοποιημένη θέσηreaddir- ο επαναλήπτης του οποίου τη θέση αναφέρει ηtelldir· προωθεί τον δρομέα που παρατηρεί ηtelldirrewinddir- φθηνότερη από τηseekdirσε διακριτικό αρχής ροής όταν θέλετε απλώς να επαναλάβετε ξανά τον κατάλογοopendir- δημιουργεί τοDIRHANDLEπου ερωτά ηtelldir· κάθε διακριτικόtelldirείναι δεμένο σε μία κλήση openclosedir- ακυρώνει κάθε διακριτικόtelldirγια το handletell- το ανάλογο για file handle· ίδιο συμβόλαιο αδιαφανούς διακριτικού, διαφορετική υποκείμενη κλήση συστήματος