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"· καταφύγετε σε αυτήν όταν κάθε εγγραφή τελειώνει σε newlineselect- αλλάζει σε ποιο filehandle γράφει η μορφή χωρίς filehandle τηςprintf$\- διαχωριστής εγγραφών εξόδου· σκόπιμα δεν προστίθεται από τηνprintf$_- χρησιμοποιείται ως μορφή όταν παραλείπονται και ηFORMATκαι ηLIST