sprintf#
Κατασκευάζει μορφοποιημένη συμβολοσειρά από ένα πρότυπο μορφοποίησης και μια λίστα τιμών.
Η sprintf παίρνει μια συμβολοσειρά FORMAT που περιέχει κυριολεκτικό κείμενο με ενσωματωμένους προσδιοριστές μετατροπής που εισάγονται από %, καταναλώνει τιμές από τη LIST για να συμπληρώσει κάθε προσδιοριστή, και επιστρέφει τη συμβολοσειρά που προκύπτει. Είναι η ίδια μηχανική που οδηγεί την printf, χωρίς την εγγραφή σε filehandle. Η Perl υλοποιεί τον δικό της μορφοποιητή· δεν καλεί την sprintf(3) της βιβλιοθήκης C εκτός από την τελική παραγωγή ψηφίων κινητής υποδιαστολής, οπότε μη τυποποιημένες επεκτάσεις που τυχόν υπάρχουν στη δική σας libc δεν είναι διαθέσιμες εδώ.
Σύνοψη#
my $s = sprintf $format, @args;
my $s = sprintf "%-10s %5d", $name, $count;
my $s = sprintf "%.3f", $x;
Τι επιστρέφεται#
Μια μοναδική βαθμωτή συμβολοσειρά. Ποτέ λίστα, ανεξάρτητα από το περιβάλλον. Αν το FORMAT δεν περιέχει προσδιοριστές %, η τιμή επιστροφής είναι το FORMAT αμετάβλητο και η LIST αγνοείται. Αν το FORMAT αναφέρει περισσότερα ορίσματα από όσα παρέχει η LIST, οι τιμές που λείπουν μεταχειρίζονται ως undef (αριθμητικό μηδέν ή κενή συμβολοσειρά ανάλογα με τη μετατροπή), και εκδίδεται προειδοποίηση Missing argument in sprintf υπό use warnings.
Η διαβίβαση πίνακα ως πρώτο όρισμα είναι σχεδόν πάντα λάθος - ο πίνακας αποτιμάται σε βαθμωτό περιβάλλον, οπότε η Perl χρησιμοποιεί το πλήθος των στοιχείων του ως μορφή. Χρησιμοποιήστε sprintf $format, @rest με τη μορφή κρατημένη ξεχωριστά, ή sprintf "@array" για την περίπτωση πίνακα ως συμβολοσειρά.
Καθολική κατάσταση που επηρεάζει#
Το locale
LC_NUMERIC, όταν είναι ενεργή ηuse localeκαι έχει κληθεί ηPOSIX::setlocale, καθορίζει τον χαρακτήρα δεκαδικής υποδιαστολής που χρησιμοποιούν τα%e,%f,%gκαι οι κεφαλαίες παραλλαγές τους. Χωρίςuse localeη δεκαδική υποδιαστολή είναι πάντα., ακόμη και αν το locale της διεργασίας λέει κάτι διαφορετικό.Καμία άλλη ειδική μεταβλητή δεν συμβουλεύεται. Η
sprintfδεν διαβάζει την$_· απαιτείται ρητή λίστα.
Προσδιοριστές μετατροπής#
Το βασικό σύνολο, με τη σειρά που πραγματικά θα τους χρειαστείτε:
Προσδ. | Σημασία |
|---|---|
| Συμβολοσειρά. Μετατρέπει το όρισμα σε συμβολοσειρά. |
| Προσημασμένος ακέραιος σε δεκαδικό. Οι αριθμοί κινητής υποδιαστολής αποκόπτονται προς το μηδέν. |
| Μη προσημασμένος ακέραιος σε δεκαδικό. |
| Κινητή υποδιαστολή σταθερής θέσης. Προεπιλογή 6 ψηφία μετά τη δεκαδική. |
| Επιστημονική σημειογραφία. Το κεφαλαίο |
|
|
| Μη προσημασμένος ακέραιος σε δεκαεξαδικό· το |
| Μη προσημασμένος ακέραιος σε οκταδικό. |
| Μη προσημασμένος ακέραιος σε δυαδικό. |
| Μονός χαρακτήρας του οποίου το σημείο κώδικα είναι ο δοθείς ακέραιος. |
| Κυριολεκτικό |
| Διεύθυνση τιμής Perl, σε δεκαεξαδικό. Μόνο για διαγνωστική χρήση. |
| Αποθηκεύει τον αριθμό των χαρακτήρων που έχουν γραφτεί μέχρι τώρα στο επόμενο όρισμα (που πρέπει να είναι εγγράψιμο βαθμωτό). |
| Δεκαεξαδική κινητή υποδιαστολή. |
Τα κεφαλαία συνώνυμα μεγέθους %D %U %O και %F υπάρχουν για λόγους ιστορικής συμβατότητας· προτιμήστε τις πεζές μορφές.
Σημαίες, πλάτος, ακρίβεια#
Μεταξύ % και του γράμματος μετατροπής, με τη σειρά:
Δείκτης ορίσματος - το
N$επιλέγει το N-στό όρισμα (αρχίζοντας από 1):sprintf '%2$s %1$s', 'world', 'hello'αποδίδει"hello world".Σημαίες - οποιοσδήποτε συνδυασμός των:
-στοίχιση αριστερά μέσα στο πεδίο (προεπιλογή είναι η στοίχιση δεξιά).+προθεματίζει τους μη αρνητικούς αριθμούς με+.` `(κενό) προθεματίζει τους μη αρνητικούς αριθμούς με κενό. Όταν δίνονται και κενό και+, υπερισχύει το+.0συμπληρώνει τις αριθμητικές μετατροπές με μηδενικά αντί για κενά. Αγνοείται όταν είναι ορισμένο και το-ή όταν δίνεται ακρίβεια για ακεραίους.#εναλλακτική μορφή: πρόθεμα0για οκταδικό, πρόθεμα0x/0Xγια μη μηδενικό δεκαεξαδικό, πρόθεμα0b/0Bγια μη μηδενικό δυαδικό.
Ελάχιστο πλάτος - δεκαδικός αριθμός, ή
*για να ληφθεί το πλάτος από το επόμενο όρισμα, ή*N$για ρητό όρισμα. Το αρνητικό πλάτος (μέσω*) είναι ισοδύναμο με τη σημαία-.Ακρίβεια -
.ακολουθούμενη από δεκαδικό αριθμό, ή.*(επόμενο όρισμα), ή.*N$. Η σημασία εξαρτάται από τη μετατροπή:%f/%e: ψηφία μετά τη δεκαδική υποδιαστολή (προεπιλογή 6).%g: συνολικά σημαντικά ψηφία.%d/%x/%o/%b: ελάχιστα ψηφία· ο αριθμός συμπληρώνεται με μηδενικά μέχρι αυτό το πλάτος. Η σημαία0αγνοείται όταν είναι παρούσα ακρίβεια για ακεραίους.%s: μέγιστο πλάτος· αποκόπτει.
Τροποποιητής μεγέθους -
hh,h,j,l,q,L,ll,t,z,V. Ερμηνεύει το όρισμα ως συγκεκριμένο τύπο C. Σχεδόν ποτέ χρήσιμο από Perl - η Perl έχει έναν τύπο ακεραίου και έναν τύπο float, και οι τιμές επιπέδου Perl δεν υπερχειλίζουν στα μεγέθη που επιλέγουν αυτοί οι τροποποιητές. ΤοVείναι no-op που σημαίνει «το προεπιλεγμένο μέγεθος της Perl».Γράμμα μετατροπής - μία από τις εγγραφές του πίνακα παραπάνω.
Η σημαία διανύσματος#
Προθεματίστε το γράμμα μετατροπής με v (προαιρετικά *v ή *N$v για να παρέχετε διαχωριστή) και η Perl μεταχειρίζεται το όρισμα ως διάνυσμα σημείων κώδικα, εφαρμόζοντας τη μετατροπή σε κάθε σημείο κώδικα και ενώνοντας τα αποτελέσματα με . (ή τον διαχωριστή που παρασχέθηκε):
sprintf "%vd", "AB\x{100}"; # "65.66.256"
sprintf "%vX", "\x01\x02\x1f"; # "1.2.1F"
sprintf "%*vX", ":", "\xde\xad\xbe\xef"; # "DE:AD:BE:EF"
Συνηθισμένες χρήσεις: απεικόνιση της $^V, μορφοποίηση ακολουθιών bytes IPv4 / IPv6, ή απόρριψη bitstrings. Το όρισμα διαβάζεται πάντα ως συμβολοσειρά σημείων κώδικα, όχι ως λίστα.
Παραδείγματα#
Συμπλήρωση και στοίχιση συμβολοσειρών σε στήλη αναφοράς σταθερού πλάτους:
printf "%-10s %5d\n", "widgets", 42; # "widgets 42\n"
printf "%-10s %5d\n", "sprockets", 7; # "sprockets 7\n"
Συμπλήρωση ακεραίου σταθερού πλάτους με μηδενικά, π.χ. για λεξικογραφικά κλειδιά ταξινόμησης ή αριθμούς γραμμών:
sprintf "%08d", 1234; # "00001234"
sprintf "%05d", -7; # "-0007" (sign consumes a slot)
Στρογγυλοποίηση σε σταθερό αριθμό δεκαδικών θέσεων. Η sprintf κάνει τη στρογγυλοποίηση· η printf είναι ο συνηθισμένος τρόπος εξαναγκασμού μιας τιμής για εμφάνιση:
sprintf "%.3f", 3.14159265; # "3.142"
sprintf "%.0f", 2.5; # "2" or "3" - banker's rounding
# is platform-dependent
Επιστημονική σημειογραφία, με και χωρίς επιλεγμένη ακρίβεια:
sprintf "%e", 6.022e23; # "6.022000e+23"
sprintf "%.2e", 6.022e23; # "6.02e+23"
sprintf "%g", 0.0001234; # "0.0001234"
sprintf "%g", 0.00001234; # "1.234e-05" (switches to %e)
Δεκαεξαδικά, οκταδικά και δυαδικά με το πρόθεμα εναλλακτικής μορφής #:
sprintf "%#x", 255; # "0xff"
sprintf "%#o", 8; # "010"
sprintf "%#b", 10; # "0b1010"
sprintf "%08b", 10; # "00001010" (no prefix, width 8)
Χαρακτήρας από σημείο κώδικα - το %c είναι ουσιαστικά η chr δρομολογημένη μέσα από τη μηχανή μορφοποίησης:
sprintf "%c", 65; # "A"
sprintf "%c", 0x2014; # "-" (em dash)
Πλάτος πεδίου από τη λίστα ορισμάτων - χρήσιμο όταν το πλάτος υπολογίζεται σε χρόνο εκτέλεσης:
my $w = 12;
sprintf "%-*s|", "name", $w; # "name |"
Ορίσματα εκτός σειράς - χρήσιμα όταν η ίδια τιμή εμφανίζεται πολλές φορές ή όταν τοπικοποιημένες μορφές αναδιατάσσουν τα placeholders:
sprintf "%2\$s loves %1\$s", "Alice", "Bob"; # "Bob loves Alice"
Κατασκευή συμβολοσειράς διεύθυνσης IPv4:
sprintf "%vd", "\x7f\x00\x00\x01"; # "127.0.0.1"
Αποτύπωση μήκους μέσω %n (το λαμβάνον όρισμα πρέπει να είναι εγγράψιμο βαθμωτό):
my $written;
my $s = sprintf "hello%n, world", $written;
# $s is "hello, world"
# $written is 5
Οριακές περιπτώσεις#
Αποκοπή ακεραίων στο
%dμε floats: το%dμετατρέπει μέσω εξαναγκασμού σε ακέραιο, που αποκόπτει προς το μηδέν. Τοsprintf "%d", 3.9είναι"3", όχι"4". Χρησιμοποιήστε%.0fαν θέλετε εμφάνιση με τραπεζική στρογγυλοποίηση, ήint/sprintf "%.0f"ρητά πρώτα.%sσε αντικείμενο: εκτελείται η μετατροπή σε συμβολοσειρά, που μπορεί να επικαλεστεί υπερφορτωμένη""ή να υποχωρήσει σε"ClassName=HASH(0x…)". Δεν υπάρχει τρόπος καταστολής της υπερφόρτωσης μέσα στηνsprintf· καλέστε πρώτα τηνoverload::StrVal($obj)αν χρειάζεστε την ωμή μορφή.Ορίσματα που λείπουν: το
sprintf "%s %s", "one"επιστρέφει"one "και προειδοποιείMissing argument in sprintf at …υπόuse warnings. Δεν εγείρεται εξαίρεση.Πάρα πολλά ορίσματα: τα επιπλέον αγνοούνται σιωπηλά. Καμία προειδοποίηση.
Το
%sμε ακρίβεια αποκόπτει, το%dμε ακρίβεια συμπληρώνει με μηδενικά. Τοsprintf "%.3s", "abcdef"είναι"abc". Τοsprintf "%.3d", 7είναι"007".Σημαία
%0έναντι ακρίβειας σε ακεραίους: υπερισχύει η ακρίβεια. Τοsprintf "%05.3d", 7είναι" 007", όχι"00007"- η σημαία0αγνοείται από τη στιγμή που δίνετε ρητή ακρίβεια ακεραίου.Αρνητικό πλάτος μέσω
*: τοsprintf "%*s", -6, "x"είναι"x ". Η αρνητική ακρίβεια μέσω.*μετράει ως καθόλου ακρίβεια.NaN και Inf: το
sprintf "%f", 9**9**9αποδίδει"Inf"· τοsprintf "%f", -sin(9**9**9)αποδίδει"NaN". Η ακριβής γραφή ("Inf"έναντι"inf","NaN"έναντι"nan") ακολουθεί τη σύμβαση της εν λόγω έκδοσης της Perl, όχι τη διάκριση πεζών-κεφαλαίων%f/%F.Δεκαδική υποδιαστολή locale: με
use localeκαι localede_DE, τοsprintf "%.2f", 1.5μπορεί να παράγει"1,50". Χωρίςuse localeτο αποτέλεσμα είναι πάντα"1.50". Κώδικας που γράφει αριθμητική έξοδο για κατανάλωση από άλλα προγράμματα θα έπρεπε είτε να αποφεύγει τηνuse localeσε αυτή την εμβέλεια είτε να χρησιμοποιείuse locale ':not_characters'και να μορφοποιεί αριθμούς εκτός της επιρροής του locale.Το
%pείναι μόνο διαγνωστικό: η δεκαεξαδική τιμή δείκτη αλλάζει από εκτέλεση σε εκτέλεση και είναι άνευ σημασίας εκτός της τρέχουσας διεργασίας. Μην τη χρησιμοποιείτε ως κλειδί ταυτότητας - δύο αναφορές μπορεί να μοιράζονται την ίδια διεύθυνση αφού η πρώτη έχει αποδεσμευτεί.Πίνακας διαβιβασμένος ως
FORMAT: τοsprintf @aμορφοποιεί χρησιμοποιώντας τη βαθμωτή μέτρηση του@aως συμβολοσειρά μορφής. Σχεδόν πάντα σφάλμα. Κρατήστε πάντα τη μορφή σε δικό της βαθμωτό.Μη υποστηριζόμενος τροποποιητής μεγέθους: σε πλατφόρμες που στερούνται π.χ. long doubles, το μέγεθος
L/q/llσε μετατροπή float υποχωρεί σιωπηλά στο προεπιλεγμένο μέγεθος, και εκδίδεται προειδοποίησηprintfυπόuse warnings. Για να την προωθήσετε σε εξαίρεση, χρησιμοποιήστεuse warnings FATAL => 'printf'.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
printf- ίδια μηχανή μορφοποίησης, αλλά γράφει σε filehandle αντί να επιστρέφει τη συμβολοσειράprint- χρησιμοποιήστε την με ένα προ-κατασκευασμένο αποτέλεσμα τηςsprintfόταν θέλετε να μορφοποιήσετε μία φορά και να γράψετε σε αρκετά handleschr- μονό σημείο κώδικα σε μονό χαρακτήρα· ισοδύναμο μεsprintf "%c", $nhex,oct- αντίστροφες λειτουργίες: αναλύουν συμβολοσειρά σε δεκαεξαδικό/οκταδικό/δυαδικό πίσω σε αριθμόpack- κατασκευάζει δυαδική συμβολοσειρά από πρότυπο· καταφύγετε σε αυτή όταν η έξοδος είναι bytes, όχι αναγνώσιμη από άνθρωπο μορφή$_- δεν συμβουλεύεται από τηνsprintf· σε αντίθεση με πολλές ενσωματωμένες, χρειάζεται πάντα ρητή λίστα