I/O

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 για μια φορητή λύση μέσα στη διεργασία, ή χρησιμοποιήστε το άρθρωμα CPAN Term::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 ούτε καταφεύγει στο μαγικό handle ARGV - διαβάζει απευθείας από το STDIN.

  • Ευρεία είσοδος τερματικού: η ανάγνωση χαρακτήρα από τερματικό σε raw mode εξακολουθεί να επιστρέφει ένα σημείο κώδικα μόνο όταν το στρώμα εισόδου αποκωδικοποιεί UTF-8. Μια επικόλληση που περιέχει χαρακτήρα πολλαπλών bytes υπό handle σε λειτουργία bytes αναδύεται ως πολλές ξεχωριστές κλήσεις getc, μία ανά byte.

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

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

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

  • read - διαβάζει σταθερό αριθμό χαρακτήρων ή bytes σε μία κλήση, πολύ ταχύτερη από βρόχο getc

  • readline - διαβάζει μία ολόκληρη εγγραφή (γραμμή) τη φορά, διεπόμενη από το $/

  • sysread - ανάγνωση χωρίς ενταμιευτή απευθείας από το λειτουργικό, παρακάμπτοντας τη στοίβα στρωμάτων PerlIO

  • eof - ελέγχει αν η επόμενη getc / readline θα επέστρεφε undef για τέλος αρχείου

  • $! - το errno που τίθεται όταν η getc επιστρέφει undef λόγω σφάλματος ανάγνωσης