Βαθμωτά και συμβολοσειρές

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 δεν διαβάζει την $_· απαιτείται ρητή λίστα.

Προσδιοριστές μετατροπής#

Το βασικό σύνολο, με τη σειρά που πραγματικά θα τους χρειαστείτε:

Προσδ.

Σημασία

%s

Συμβολοσειρά. Μετατρέπει το όρισμα σε συμβολοσειρά.

%d, %i

Προσημασμένος ακέραιος σε δεκαδικό. Οι αριθμοί κινητής υποδιαστολής αποκόπτονται προς το μηδέν.

%u

Μη προσημασμένος ακέραιος σε δεκαδικό.

%f, %F

Κινητή υποδιαστολή σταθερής θέσης. Προεπιλογή 6 ψηφία μετά τη δεκαδική.

%e, %E

Επιστημονική σημειογραφία. Το κεφαλαίο E επιλέγει την κεφαλαία μορφή.

%g, %G

%e ή %f, όποιο είναι συντομότερο. Η ακρίβεια αφορά τα σημαντικά ψηφία, όχι τα ψηφία μετά τη δεκαδική.

%x, %X

Μη προσημασμένος ακέραιος σε δεκαεξαδικό· το %X χρησιμοποιεί κεφαλαία AF.

%o

Μη προσημασμένος ακέραιος σε οκταδικό.

%b, %B

Μη προσημασμένος ακέραιος σε δυαδικό.

%c

Μονός χαρακτήρας του οποίου το σημείο κώδικα είναι ο δοθείς ακέραιος.

%%

Κυριολεκτικό %. Δεν καταναλώνει όρισμα.

%p

Διεύθυνση τιμής Perl, σε δεκαεξαδικό. Μόνο για διαγνωστική χρήση.

%n

Αποθηκεύει τον αριθμό των χαρακτήρων που έχουν γραφτεί μέχρι τώρα στο επόμενο όρισμα (που πρέπει να είναι εγγράψιμο βαθμωτό).

%a, %A

Δεκαεξαδική κινητή υποδιαστολή.

Τα κεφαλαία συνώνυμα μεγέθους %D %U %O και %F υπάρχουν για λόγους ιστορικής συμβατότητας· προτιμήστε τις πεζές μορφές.

Σημαίες, πλάτος, ακρίβεια#

Μεταξύ % και του γράμματος μετατροπής, με τη σειρά:

  1. Δείκτης ορίσματος - το N$ επιλέγει το N-στό όρισμα (αρχίζοντας από 1): sprintf '%2$s %1$s', 'world', 'hello' αποδίδει "hello world".

  2. Σημαίες - οποιοσδήποτε συνδυασμός των:

    • - στοίχιση αριστερά μέσα στο πεδίο (προεπιλογή είναι η στοίχιση δεξιά).

    • + προθεματίζει τους μη αρνητικούς αριθμούς με +.

    • ` ` (κενό) προθεματίζει τους μη αρνητικούς αριθμούς με κενό. Όταν δίνονται και κενό και +, υπερισχύει το +.

    • 0 συμπληρώνει τις αριθμητικές μετατροπές με μηδενικά αντί για κενά. Αγνοείται όταν είναι ορισμένο και το - ή όταν δίνεται ακρίβεια για ακεραίους.

    • # εναλλακτική μορφή: πρόθεμα 0 για οκταδικό, πρόθεμα 0x/0X για μη μηδενικό δεκαεξαδικό, πρόθεμα 0b/0B για μη μηδενικό δυαδικό.

  3. Ελάχιστο πλάτος - δεκαδικός αριθμός, ή * για να ληφθεί το πλάτος από το επόμενο όρισμα, ή *N$ για ρητό όρισμα. Το αρνητικό πλάτος (μέσω *) είναι ισοδύναμο με τη σημαία -.

  4. Ακρίβεια - . ακολουθούμενη από δεκαδικό αριθμό, ή .* (επόμενο όρισμα), ή .*N$. Η σημασία εξαρτάται από τη μετατροπή:

    • %f / %e: ψηφία μετά τη δεκαδική υποδιαστολή (προεπιλογή 6).

    • %g: συνολικά σημαντικά ψηφία.

    • %d / %x / %o / %b: ελάχιστα ψηφία· ο αριθμός συμπληρώνεται με μηδενικά μέχρι αυτό το πλάτος. Η σημαία 0 αγνοείται όταν είναι παρούσα ακρίβεια για ακεραίους.

    • %s: μέγιστο πλάτος· αποκόπτει.

  5. Τροποποιητής μεγέθους - hh, h, j, l, q, L, ll, t, z, V. Ερμηνεύει το όρισμα ως συγκεκριμένο τύπο C. Σχεδόν ποτέ χρήσιμο από Perl - η Perl έχει έναν τύπο ακεραίου και έναν τύπο float, και οι τιμές επιπέδου Perl δεν υπερχειλίζουν στα μεγέθη που επιλέγουν αυτοί οι τροποποιητές. Το V είναι no-op που σημαίνει «το προεπιλεγμένο μέγεθος της Perl».

  6. Γράμμα μετατροπής - μία από τις εγγραφές του πίνακα παραπάνω.

Η σημαία διανύσματος#

Προθεματίστε το γράμμα μετατροπής με 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 και locale de_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 όταν θέλετε να μορφοποιήσετε μία φορά και να γράψετε σε αρκετά handles

  • chr - μονό σημείο κώδικα σε μονό χαρακτήρα· ισοδύναμο με sprintf "%c", $n

  • hex, oct - αντίστροφες λειτουργίες: αναλύουν συμβολοσειρά σε δεκαεξαδικό/οκταδικό/δυαδικό πίσω σε αριθμό

  • pack - κατασκευάζει δυαδική συμβολοσειρά από πρότυπο· καταφύγετε σε αυτή όταν η έξοδος είναι bytes, όχι αναγνώσιμη από άνθρωπο μορφή

  • $_ - δεν συμβουλεύεται από την sprintf· σε αντίθεση με πολλές ενσωματωμένες, χρειάζεται πάντα ρητή λίστα