I/O

eof#

Ελέγχει ένα filehandle για τέλος αρχείου.

Η eof αναφέρει αν η επόμενη ανάγνωση σε ένα filehandle θα επιστρέψει τέλος αρχείου. Οι τρεις μορφές κλήσης μοιάζουν, αλλά σημαίνουν διαφορετικά πράγματα: η eof FILEHANDLE ρωτά για ένα συγκεκριμένο handle, η σκέτη eof ρωτά για το handle από το οποίο έγινε η πιο πρόσφατη ανάγνωση, και η eof() με κενές παρενθέσεις ρωτά για την εικονική ροή ARGV που τροφοδοτείται από τον <>. Οι μορφές δεν είναι εναλλάξιμες - η επιλογή της λάθος είναι το κλασικό σφάλμα με αυτή την ενσωματωμένη συνάρτηση.

Σύνοψη#

eof FILEHANDLE
eof()
eof

Τι επιστρέφεται#

1 αν η επόμενη ανάγνωση στο handle θα επέστρεφε τέλος αρχείου, ή αν το handle δεν είναι ανοιχτό. 0 διαφορετικά. Η eof ποτέ δεν μπλοκάρει περιμένοντας περισσότερη είσοδο σε ένα κανονικό αρχείο, αλλά σε σωλήνα ή τερματικό ενδέχεται να χρειαστεί να διαβάσει και να επιστρέψει έναν χαρακτήρα για να αποφασίσει - δείτε Οριακές περιπτώσεις.

Καθολική κατάσταση που επηρεάζει#

  • ARGV - το μαγικό filehandle που υποστηρίζει τον τελεστή <>. Η eof() το εξετάζει και ενδέχεται να το προχωρήσει· η eof μέσα σε βρόχο while (<>) το ρωτά έμμεσα.

  • @ARGV - η λίστα των ονομάτων αρχείων που διατρέχει ο <>. Η eof() που καλείται πριν χρησιμοποιηθεί ο <> πυροδοτεί επιθεώρηση του @ARGV και, αν είναι κενός, ρυθμίζει την ανάγνωση από το STDIN.

  • $. - ο τρέχων αριθμός γραμμής εισόδου, συνδεδεμένος με το handle που ρωτά η eof. Δεν γράφεται από την ίδια την eof, αλλά είναι σχετικός στα ιδιώματα παρακάτω όπου η close ARGV τον επαναφέρει στα όρια αρχείων.

Οι τρεις μορφές, αναλυτικά#

eof FILEHANDLE - ρωτά για αυτό το ένα handle. Το FILEHANDLE μπορεί να είναι bareword, βαθμωτό που κρατά handle, ή έκφραση που αποτιμάται σε handle. Επιστρέφει αληθές για ένα handle κλειστό ή που δεν άνοιξε ποτέ.

eof (χωρίς παρενθέσεις, χωρίς όρισμα) - ρωτά για το τελευταίο αρχείο που διαβάστηκε. Μέσα σε βρόχο while (<>) { ... } αυτό σημαίνει «το τρέχον αρχείο ARGV» - το φυσικό αρχείο που αυτή τη στιγμή ρέει, όχι ολόκληρη η ακολουθία του <>. Η eof γίνεται αληθής σε κάθε όριο αρχείου, μία φορά ανά αρχείο εισόδου.

eof() (κενές παρενθέσεις) - ρωτά για τη ροή του <> ως σύνολο. Γίνεται αληθής μόνο στο τέλος του τελευταίου αρχείου στο @ARGV. Αν ο <> δεν έχει χρησιμοποιηθεί ακόμη, η eof() θα εξετάσει το @ARGV, θα καταφύγει στο STDIN όταν το @ARGV είναι κενό, και ενδέχεται όντως να ανοίξει το πρώτο αρχείο για να απαντήσει στην ερώτηση.

Η σκέτη eof και η eof() φαίνονται σχεδόν πανομοιότυπες και κάνουν εντελώς διαφορετικά πράγματα. Οι παρενθέσεις έχουν σημασία.

Παραδείγματα#

Έλεγχος ενός συγκεκριμένου handle πριν την επόμενη ανάγνωση:

open my $fh, "<", "data.txt" or die $!;
while (not eof $fh) {
    my $line = <$fh>;
    # process $line
}
close $fh;

Το κλασικό ιδίωμα while (<>), με επαναφορά του $. σε κάθε όριο αρχείου. Η σκέτη eof (χωρίς παρενθέσεις) είναι αυτό που θέλετε εδώ - πυροδοτείται μία φορά ανά αρχείο εισόδου:

while (<>) {
    next if /^\s*#/;
    print "$.\t$_";
} continue {
    close ARGV if eof;        # not eof() - resets $. per file
}

Εισαγωγή ενός δείκτη πριν την τελευταία γραμμή του τελευταίου αρχείου. Η eof() με παρενθέσεις πιάνει το τέλος ολόκληρης της ροής <>, όχι κάθε αρχείου:

while (<>) {
    if (eof()) {
        print "--------------\n";
    }
    print;
    last if eof();            # needed when reading from a terminal
}

Προστασία έναντι κλειστού handle. Η eof σε κλειστό ή ποτέ-ανοιχτό handle επιστρέφει αληθές χωρίς προειδοποίηση:

my $fh;                       # never opened
if (eof $fh) {
    warn "handle not ready";
}

Οριακές περιπτώσεις#

  • Η eof πριν από οποιαδήποτε ανάγνωση επιστρέφει ψευδές, όχι αληθές. Η σκέτη eof χωρίς προηγούμενη ανάγνωση δεν έχει «τελευταίο αρχείο που διαβάστηκε» στο οποίο να αναφερθεί και η Perl την αντιμετωπίζει ως ψευδή. Το if (eof) { ... } στην αρχή ενός προγράμματος δεν σημαίνει «αν δεν υπάρχει είσοδος» - χρησιμοποιήστε eof() για αυτό.

  • Η eof() πριν χρησιμοποιηθεί ο <> έχει παρενέργειες. Εξετάζει το @ARGV, και αν το @ARGV είναι κενό ρυθμίζει τον <> να διαβάζει από το STDIN. Μια απρόσεκτη eof() στην αρχή του προγράμματος μπορεί επομένως να συνδέσει σιωπηλά το πρόγραμμα στο STDIN.

  • Η eof() μετά την εξάντληση της εισόδου του <> υποθέτει ότι ξεκινάτε ένα ακόμη πέρασμα του @ARGV. Αν το @ARGV είναι κενό σε εκείνο το σημείο, η επόμενη χρήση του <> διαβάζει το STDIN. Αυτό συνήθως δεν είναι αυτό που θέλετε· ορίστε το @ARGV ρητά ή ελέγξτε τη σκέτη μορφή eof.

  • Η eof σε τερματικό καταναλώνει έναν χαρακτήρα. Η υλοποίηση διαβάζει ένα byte και του εφαρμόζει ungetc για να διαπιστώσει αν υπάρχει περισσότερη είσοδος. Σε τερματικά η επιστροφή ενδέχεται να μην επιβιώσει μετά την επίτευξη τέλους αρχείου - μην καλείτε eof FH σε τερματικό αφού έχετε ήδη χτυπήσει EOF εκεί, διαφορετικά το handle μπορεί να χάσει την κατάσταση τέλους αρχείου του.

  • Κλεισμένο ή ποτέ-ανοιχτό handle - η eof FILEHANDLE επιστρέφει αληθές. Δεν υπάρχει τρόπος διάκρισης μεταξύ «κλειστό» και «στο EOF» χρησιμοποιώντας μόνο την eof· ελέγξτε την fileno ή παρακολουθήστε την κατάσταση ανοίγματος μόνοι σας αν αυτό έχει σημασία.

  • Η eof(ARGV) ισούται με τη σκέτη eof μέσα σε while (<>). Και οι δύο ρωτούν για το τρέχον αρχείο ARGV. Προτιμήστε τη σκέτη eof για συντομία και για να γίνει η μορφή eof() με παρενθέσεις οπτικά διακριτή.

  • Σπάνια χρειάζεστε καθόλου την eof. Οι τελεστές εισόδου επιστρέφουν undef στο τέλος αρχείου, οπότε τα while (my $line = <$fh>) { ... } και while (<>) { ... } χειρίζονται τον τερματισμό χωρίς κανέναν έλεγχο eof. Καταφύγετε στην eof μόνο όταν χρειάζεται να ενεργήσετε στο όριο - τελευταία γραμμή, επαναφορά ανά αρχείο, δείκτης τελικού αρχείου.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • readline - διαβάζει μια γραμμή από handle· επιστρέφει undef στο τέλος αρχείου, κάτι που αντικαθιστά τις περισσότερες χρήσεις της eof

  • read - μπλοκαριστική ανάγνωση σταθερού πλήθους bytes· επιστρέφει 0 στο τέλος αρχείου

  • getc - διαβάζει έναν μόνο χαρακτήρα· επιστρέφει undef στο τέλος αρχείου

  • close - κλείσιμο handle· ο συνηθισμένος συνεργάτης της eof στο ιδίωμα επαναφοράς ανά αρχείο close ARGV if eof

  • ARGV - το μαγικό handle που τροφοδοτείται από τον <> και που ρωτούν η eof και η eof()