I/O

printf#

Γράφει μια μορφοποιημένη συμβολοσειρά σε ένα filehandle.

Η printf είναι print FILEHANDLE sprintf(FORMAT, LIST) με μία σκόπιμη εξαίρεση: ο διαχωριστής εγγραφών εξόδου $\ δεν προστίθεται. Οι κανόνες στόχευσης είναι κατά τα άλλα οι κανόνες της print - bareword ή απλό-βαθμωτό filehandle αμέσως πριν τη λίστα ορισμάτων, ή η μορφή μπλοκ {EXPR} για οτιδήποτε πιο σύνθετο. Αν παραλειφθεί το FILEHANDLE, η έξοδος πηγαίνει στο τρέχον επιλεγμένο handle (βλ. select), που ξεκινά τη ζωή του ως STDOUT.

Δείτε την sprintf για την αναφορά προδιαγραφών μορφής - όλα τα %d, %s, %.3f, %*d, %1$s, %v, σημαίες διανύσματος, ευαίσθητο σε locale %f, κ.ο.κ. Αυτή η σελίδα καλύπτει μόνο την ειδική για την printf επιφάνεια: επίλυση filehandle, τον κανόνα «η μορφή είναι πρώτη» και τις ιδιοτροπίες γύρω από τη μορφή χωρίς όρισμα.

Σύνοψη#

printf FORMAT, LIST
printf FILEHANDLE FORMAT, LIST
printf {EXPR} FORMAT, LIST
printf FH                      # bareword filehandle, $_ as format

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

1 σε επιτυχία, undef σε αποτυχία (με την $! ορισμένη). Όπως και με την print, η τιμή επιστροφής σπάνια ελέγχεται για εγγραφές στο STDOUT / STDERR, και αξίζει να ελέγχεται για εγγραφές σε αρχεία, σωλήνες και υποδοχές όπου έχουν σημασία οι μερικές εγγραφές και οι σπασμένοι σωλήνες.

printf $fh "%-20s %8d\n", $name, $count
    or die "write to $path failed: $!";

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

  • Επιλεγμένο filehandle (αλλάζει μέσω της select): ο προορισμός όταν παραλείπεται το FILEHANDLE. Ξεκινά ως STDOUT.

  • $\ (διαχωριστής εγγραφών εξόδου): σκόπιμα δεν προστίθεται - αυτή είναι η μία σημασιολογική διαφορά ανάμεσα στην printf FORMAT, LIST και την print FILEHANDLE sprintf(FORMAT, LIST). Βάλτε το newline στη συμβολοσειρά μορφής.

  • $, (διαχωριστής πεδίων εξόδου): δεν συμβουλεύεται. Η printf συναρμολογεί τα στοιχεία της λίστας μέσα στη μορφή σύμφωνα με τις μετατροπές, όχι με διαχωριστή.

  • $_: χρησιμοποιείται ως μορφή όταν παραλείπονται τόσο η FORMAT όσο και η LIST, δεν προστίθεται στην έξοδο. Σχεδόν ποτέ αυτό που θέλετε· βλ. Οριακές περιπτώσεις.

  • $!: τίθεται σε αποτυχία εγγραφής.

  • $|: σημαία autoflush για το επιλεγμένο handle. Η printf εντάμιεύει μέσω PerlIO όπως η print.

  • locale LC_NUMERIC: όταν η use locale είναι ενεργή και έχει κληθεί η POSIX::setlocale, η δεκαδική υποδιαστολή για μετατροπές κινητής υποδιαστολής (%f, %e, %g) ακολουθεί το locale.

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

Βασική μορφοποιημένη εγγραφή στο STDOUT. Σε αντίθεση με την say ή την print-με-$\, το τελικό newline σας ανήκει:

printf "%s is %d years old\n", $name, $age;

Πλάτος και ακρίβεια για μια τακτοποιημένη στήλη:

printf "%-20s %8.2f\n", $item, $price;

Εγγραφή σε filehandle. Bareword και απλό βαθμωτό λειτουργούν απευθείας· κανένα κόμμα ανάμεσα στο filehandle και στη μορφή:

open my $fh, ">", "report.txt" or die $!;
printf $fh "%5d  %s\n", $n, $msg;
close $fh;

Filehandle που κρατείται σε πιο σύνθετη έκφραση - χρησιμοποιήστε τη μορφή μπλοκ {EXPR} (ίδιος κανόνας με την print):

my @logs = (\*STDOUT, \*STDERR);
printf { $logs[$severity] } "[%s] %s\n", $tag, $msg;

Επαναλαμβανόμενη μορφή με λίστα που εκτείνεται σε πολλές εγγραφές. Η printf δεν επανεφαρμόζει τη μορφή ανά εγγραφή - οι μετατροπές καταναλώνονται μία φορά, από αριστερά προς τα δεξιά:

printf "%s=%s\n", "user", "alice";       # "user=alice\n"
printf "%s=%s\n%s=%s\n",                 # two records, one call
       "user", "alice", "host", "db1";

Δεκαδική υποδιαστολή ευαίσθητη σε locale:

use POSIX qw(setlocale LC_NUMERIC);
use locale;
setlocale(LC_NUMERIC, "de_DE.UTF-8");
printf "%.2f\n", 1234.5;                 # "1234,50\n"

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

  • Δεν δίνεται LIST, η $_ γίνεται η μορφή. Η printf; και η printf FH; (bareword filehandle) μορφοποιούν την $_. Αν η $_ περιέχει οποιεσδήποτε μετατροπές %, αυτές επεκτείνονται έναντι κενής λίστας ορισμάτων - κάθε %s / %d γίνεται η κενή συμβολοσειρά και η use warnings εκπέμπει προειδοποίηση Missing argument in printf. Για να γράψετε την $_ αυτούσια χρησιμοποιήστε print, όχι printf.

  • Έμμεσο filehandle χωρίς λίστα είναι αμφίσημο και δεν υποστηρίζεται. Η printf $fh; αναλύει το $fh ως μορφή, όχι ως filehandle. Αν χρειάζεστε μορφή χωρίς όρισμα με βαθμωτό filehandle, περάστε μέσω print ή δώστε ρητή μορφή: printf $fh "%s", $_.

  • Το πρώτο όρισμα είναι πάντα η μορφή. Η printf(@_) χρησιμοποιεί το $_[0] ως μορφή και τα υπόλοιπα στοιχεία ως ορίσματα - αυτός είναι κανόνας ανάλυσης, όχι σύμβαση. Χτίστε τη μορφή σκόπιμα· μην εκτονώνετε λίστες που παρέχει ο χρήστης σε printf εκτός αν το πρώτο στοιχείο είναι γνωστά ασφαλές.

  • Δεν προστίθεται $\. Η ενσωμάτωση του "\n" στη μορφή είναι ο ιδιωματικός τερματιστής. Ο ορισμός local $\ = "\n" δεν έχει επίδραση στην έξοδο της printf.

  • Η $, αγνοείται. Ο διαχωριστής πεδίων εξόδου είναι έννοια της print· η printf δεν ενώνει τίποτα - υποκαθιστά.

  • Η printf (…) αναλύεται ως κλήση συνάρτησης, ακριβώς όπως η print. Η printf ("%d", 1)*2 υπολογίζει printf(...) και κατόπιν πολλαπλασιάζει την τιμή επιστροφής επί 2 και την απορρίπτει. Τυλίξτε ολόκληρη τη λίστα ορισμάτων σε παρενθέσεις ή προθέστε + αν χρειάζεται να αποσαφηνιστεί.

  • Κλειστό filehandle: επιστρέφει undef και θέτει την $! σε "Bad file descriptor". Υπό use warnings εκπέμπεται προειδοποίηση printf() on closed filehandle.

  • Στρώματα κωδικοποίησης: η printf γράφει μέσα από τη στοίβα PerlIO του handle. Στρώμα :utf8 ή :encoding(...) κωδικοποιεί κατά την έξοδο· handle σε κατάσταση bytes με συμβολοσειρά wide character εκπέμπει Wide character in printf και γράφει ωμά codepoints.

  • SIGPIPE σε κλειστό σωλήνα/υποδοχή: η προεπιλεγμένη ενέργεια τερματίζει τη διεργασία. Εγκαταστήστε το $SIG{PIPE} για να το μετατρέψετε σε ελέγξιμη αποτυχία εγγραφής.

  • Μη χρησιμοποιείτε printf όπου αρκεί η print. Η printf "%s", $msg είναι πιο αργή και πιο επιρρεπής σε σφάλματα από την print $msg - η συμβολοσειρά μορφής αναλύεται σε κάθε κλήση, και ένα ξεμοναχιασμένο % στο $msg που χρησιμοποιείται ως μορφή γίνεται σφάλμα που περιμένει να συμβεί.

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

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

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

  • print - μη μορφοποιημένη εγγραφή με τους ίδιους κανόνες filehandle· ταχύτερη, και προσθέτει την $\ εκεί που η printf δεν την προσθέτει

  • sprintf - χτίζει τη μορφοποιημένη συμβολοσειρά χωρίς να τη γράψει· η αναφορά προδιαγραφών μορφής βρίσκεται εδώ

  • say - print με την $\ αναγκαστικά σε "\n"· καταφύγετε σε αυτήν όταν κάθε εγγραφή τελειώνει σε newline

  • select - αλλάζει σε ποιο filehandle γράφει η μορφή χωρίς filehandle της printf

  • $\ - διαχωριστής εγγραφών εξόδου· σκόπιμα δεν προστίθεται από την printf

  • $_ - χρησιμοποιείται ως μορφή όταν παραλείπονται και η FORMAT και η LIST