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στο τέλος αρχείου, κάτι που αντικαθιστά τις περισσότερες χρήσεις τηςeofread- μπλοκαριστική ανάγνωση σταθερού πλήθους bytes· επιστρέφει0στο τέλος αρχείουgetc- διαβάζει έναν μόνο χαρακτήρα· επιστρέφειundefστο τέλος αρχείουclose- κλείσιμο handle· ο συνηθισμένος συνεργάτης τηςeofστο ιδίωμα επαναφοράς ανά αρχείοclose ARGV if eofARGV- το μαγικό handle που τροφοδοτείται από τον<>και που ρωτούν ηeofκαι ηeof()