getc#
Διαβάζει τον επόμενο μονό χαρακτήρα από ένα filehandle.
Η getc επιστρέφει έναν χαρακτήρα εισόδου από το FILEHANDLE, προωθώντας τη θέση ανάγνωσης του handle κατά αυτόν τον χαρακτήρα. Αν παραλειφθεί το FILEHANDLE, η getc διαβάζει από το STDIN. Σε τέλος αρχείου ή σε σφάλμα ανάγνωσης, η getc επιστρέφει undef και - στην περίπτωση σφάλματος - θέτει το $!. Η μονάδα είναι χαρακτήρας, όχι byte: υπό στρώμα PerlIO :utf8 ή :encoding(...) μία κλήση καταναλώνει όσα bytes συγκροτούν ένα αποκωδικοποιημένο σημείο κώδικα.
Σύνοψη#
getc FILEHANDLE
getc
Τι επιστρέφεται#
Συμβολοσειρά ενός χαρακτήρα σε περίπτωση επιτυχίας, ή undef σε τέλος αρχείου ή σφάλμα. Διακρίνετε τις δύο περιπτώσεις ελέγχοντας το $!:
my $ch = getc $fh;
if (!defined $ch) {
die "read error: $!" if $!;
# otherwise clean EOF
}
Επειδή το undef συμπίπτει με την κενή συμβολοσειρά "" σε συγκρίσεις τύπου συμβολοσειράς, ελέγχετε πάντα με defined, ποτέ με length ή αντιστοίχιση συμβολοσειράς.
Καθολική κατάσταση που επηρεάζει#
$!- τίθεται όταν ηgetcεπιστρέφειundefλόγω σφάλματος ανάγνωσης (δεν τίθεται σε καθαρό τέλος αρχείου).Το τρέχον filehandle εισόδου - η μορφή χωρίς όρισμα διαβάζει από το
STDIN, όχι από το handle που έχει επιλεχθεί με τηνselect. Ηselectδιέπει την προεπιλεγμένη έξοδο, όχι την προεπιλεγμένη είσοδο.Τη στοίβα στρωμάτων PerlIO του handle - καθορίζει αν το επιστρεφόμενο βαθμωτό είναι ένα byte ή ένας αποκωδικοποιημένος χαρακτήρας, και αν εφαρμόζεται μετατροπή CRLF στο πέρασμα προς τα μέσα.
Παραδείγματα#
Ανάγνωση ενός χαρακτήρα από το STDIN:
my $ch = getc;
print "got: $ch\n" if defined $ch;
Ανάγνωση από ρητό filehandle και ανίχνευση τέλους αρχείου:
open my $fh, "<", "input.txt" or die "open: $!";
while (defined(my $ch = getc $fh)) {
print $ch;
}
close $fh;
Ανάγνωση χαρακτήρων, όχι bytes, από αρχείο UTF-8. Κάθε κλήση επιστρέφει ένα αποκωδικοποιημένο σημείο κώδικα ακόμα κι όταν η υποκείμενη ροή bytes χρησιμοποιεί ακολουθίες πολλαπλών bytes:
open my $fh, "<:encoding(UTF-8)", "utf8.txt" or die $!;
my $ch = getc $fh; # e.g. "ä" as one character, even though
# it occupies two bytes on disk
Κατανάλωση προτροπής ναι/όχι χωρίς αναμονή για ολόκληρη γραμμή - απαιτεί πρώτα την απενεργοποίηση του line buffering του τερματικού (δείτε Οριακές περιπτώσεις):
print "continue? [y/n] ";
system "stty", "-icanon", "eol", "\001";
my $key = getc(STDIN);
system "stty", "icanon", "eol", "^@";
print "\n";
exit unless defined $key and lc $key eq "y";
Οριακές περιπτώσεις#
Line buffering τερματικού: σε διαδραστικό
STDIN, ο οδηγός τερματικού δεν παραδίδει τίποτα στην Perl μέχρι ο χρήστης να πατήσει Enter, οπότε ηgetcμπλοκάρει μέχρι να είναι διαθέσιμη ολόκληρη γραμμή και μετά επιστρέφει μόνο τον πρώτο της χαρακτήρα. Η ίδια ηgetcδεν μπορεί να το παρακάμψει. Για να διαβάσετε ένα πάτημα πλήκτρου, βάλτε πρώτα το τερματικό σε μη κανονική κατάσταση («cbreak») - καλέστε εξωτερικάstty, χρησιμοποιήστεPOSIX::termiosμέσω του αρθρώματοςPOSIXγια μια φορητή λύση μέσα στη διεργασία, ή χρησιμοποιήστε το άρθρωμα CPANTerm::ReadKeyγια φιλικότερη διεπαφή. Θυμηθείτε να επαναφέρετε την κατάσταση του τερματικού κατά την έξοδο, συμπεριλαμβανομένης της εξόδου από χειριστές σημάτων.Bytes έναντι χαρακτήρων υπό στρώματα I/O: η τιμή επιστροφής είναι ό,τι παράγει η στοίβα στρωμάτων του handle. Ένα handle σε λειτουργία bytes αποδίδει ένα byte ανά κλήση· ένα handle
:utf8ή:encoding(...)αποδίδει έναν αποκωδικοποιημένο χαρακτήρα ανά κλήση, καταναλώνοντας από τη ροή όσα bytes παίρνει αυτός ο χαρακτήρας. Παραμορφωμένη είσοδος υπό στρώμα αποκωδικοποίησης πυροδοτεί τη συνήθη προειδοποίηση ή σφάλμα του στρώματος αντί να επιστρέφει σιωπηρά σκουπίδια.Τέλος αρχείου έναντι σφάλματος: και τα δύο επιστρέφουν
undef. Το$!εκκαθαρίζεται πριν την είσοδο στην κλήση αλλά τίθεται μόνο όταν συνέβη πραγματικό σφάλμα ανάγνωσης, οπότε το ιδίωμα είναιdefined $ch or $! and die ....Κλειστό ή μη ανοιγμένο filehandle: επιστρέφει
undefκαι θέτει το$!σεBad file descriptor. Υπόuse warningsεκπέμπεται προειδοποίησηgetc() on closed filehandle.Αποδοτικότητα: η
getcείναι έναν-χαρακτήρα-τη-φορά, που διασχίζει τη στοίβα στρωμάτων PerlIO ανά κλήση. Για μαζική σάρωση, οιread,sysread, ήreadlineείναι ουσιαστικά ταχύτερες· κρατήστε τηνgetcγια διαδραστικές προτροπές και αναλυτές πρωτοκόλλων που χρειάζονται γνήσια έλεγχο έναν χαρακτήρα τη φορά.Το προεπιλεγμένο handle είναι το
STDIN, όχι τοARGV: σε αντίθεση με τον τελεστή «διαμάντι»<>, ηgetcχωρίς όρισμα δεν διασχίζει το@ARGVούτε καταφεύγει στο μαγικό handleARGV- διαβάζει απευθείας από τοSTDIN.Ευρεία είσοδος τερματικού: η ανάγνωση χαρακτήρα από τερματικό σε raw mode εξακολουθεί να επιστρέφει ένα σημείο κώδικα μόνο όταν το στρώμα εισόδου αποκωδικοποιεί UTF-8. Μια επικόλληση που περιέχει χαρακτήρα πολλαπλών bytes υπό handle σε λειτουργία bytes αναδύεται ως πολλές ξεχωριστές κλήσεις
getc, μία ανά byte.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
read- διαβάζει σταθερό αριθμό χαρακτήρων ή bytes σε μία κλήση, πολύ ταχύτερη από βρόχοgetcreadline- διαβάζει μία ολόκληρη εγγραφή (γραμμή) τη φορά, διεπόμενη από το$/sysread- ανάγνωση χωρίς ενταμιευτή απευθείας από το λειτουργικό, παρακάμπτοντας τη στοίβα στρωμάτων PerlIOeof- ελέγχει αν η επόμενηgetc/readlineθα επέστρεφεundefγια τέλος αρχείου$!- το errno που τίθεται όταν ηgetcεπιστρέφειundefλόγω σφάλματος ανάγνωσης