formline#
Μορφοποιεί μια λίστα τιμών σε μια συμβολοσειρά εικόνας και προσαρτά το αποτέλεσμα στον συσσωρευτή μορφοποίησης $^A.
Η formline είναι η μηχανή χαμηλού επιπέδου πίσω από τον μηχανισμό αναφορών format / write της Perl. Δέχεται μια συμβολοσειρά PICTURE που περιγράφει πλάτη και στοίχιση πεδίων, παρεμβάλλει τις τιμές από τη LIST σε αυτά τα πεδία, και προσαρτά το προκύπτον κείμενο στον καθολικό συσσωρευτή $^A (γνωστό επίσης ως $ACCUMULATOR υπό use English). Κάθε κλήση στη write εκκενώνει το $^A στο σχετιζόμενο filehandle και το καθαρίζει· εκτός της write, διαχειρίζεστε εσείς το $^A - διαβάστε το για το μορφοποιημένο κείμενο, και μετά επαναφέρετέ το σε "" πριν την επόμενη κλήση.
Το PICTURE είναι η ίδια μίνι-γλώσσα που χρησιμοποιεί η format: @<<<< για πεδίο κειμένου με αριστερή στοίχιση, @>>>> για δεξιά στοίχιση, @|||| για κεντραρισμένο, @####.## για αριθμητικό πεδίο με δεξιά στοίχιση και υποδιαστολή, @* για απεριόριστο πεδίο κειμένου πολλών γραμμών, και ^<<< (και παρόμοια) για το πεδίο λειτουργίας γεμίσματος που καταναλώνει σταδιακά το βαθμωτό όρισμά του. Δείτε perldoc perlform για το πλήρες λεξιλόγιο της εικόνας.
Σύνοψη#
formline PICTURE, LIST
formline $picture, @values
Τι επιστρέφεται#
Η formline επιστρέφει πάντα 1. Η χρήσιμη έξοδος είναι η παρενέργεια: το μορφοποιημένο κείμενο προσαρτάται στο $^A. Αν χρειάζεστε το κείμενο ως τιμή, διαβάστε το $^A μετά την κλήση και έπειτα καθαρίστε το:
$^A = "";
formline '@<<<<<<<< @>>>>', $name, $score;
my $line = $^A;
$^A = "";
Επειδή το αποτέλεσμα πηγαίνει σε συσσωρευτή, διαδοχικές κλήσεις της formline συσσωρεύουν έξοδο πολλών γραμμών χωρίς ενδιάμεσο join.
Καθολική κατάσταση που επηρεάζει#
$^A- ο συσσωρευτής μορφοποίησης. Ηformlineπροσαρτά σε αυτόν· δεν καθαρίζεται ποτέ αυτόματα. Γνωστός επίσης ως$ACCUMULATORυπόuse English.$:- το σύνολο των χαρακτήρων στους οποίους επιτρέπεται να σπάνε τα πεδία λειτουργίας γεμίσματος (^*,^<<<). Εξ ορισμού" \n-". Γνωστή επίσης ως$FORMAT_LINE_BREAK_CHARACTERSυπόuse English.Locale
LC_NUMERIC- αν είναι ενεργό τοuse localeόταν μεταγλωττίζεται η εικόνα, ο χαρακτήρας υποδιαστολής στα αριθμητικά πεδία (@###.##) ακολουθεί το locale.Τα πεδία λειτουργίας γεμίσματος (
^…) μεταλλάσσουν επιτόπου τα βαθμωτά ορίσματά τους, αποκόπτοντας το τμήμα που καταναλώθηκε ώστε η επόμενη κλήσηformlineνα συνεχίσει από εκεί που σταμάτησε η προηγούμενη. Περάστε αντίγραφο αν χρειάζεται να διατηρηθεί το πρωτότυπο.
Παραδείγματα#
Δημιουργία μίας μορφοποιημένης γραμμής και ανάγνωσή της:
$^A = "";
formline '@<<<<<<<< @>>>>>', "widget", 42;
print $^A, "\n"; # "widget 42\n"
$^A = "";
Δημιουργία ενός μπλοκ πολλών γραμμών σε μία κλήση - η εικόνα μπορεί να περιέχει newlines, και κάθε γραμμή της εικόνας καταναλώνει τις δικές της τιμές από τη LIST:
$^A = "";
formline <<'END', "Alice", 30, "Bob", 25;
@<<<<<<<<<< @###
@<<<<<<<<<< @###
END
print $^A; # "Alice 30\nBob 25\n"
$^A = "";
Μια βοηθητική swrite - η formline είναι για τη write ό,τι η sprintf για την printf:
sub swrite {
my $picture = shift;
local $^A = "";
formline $picture, @_;
return $^A;
}
my $row = swrite '@<<<<<<<< @>>>>', "total", 1234;
Το πεδίο λειτουργίας γεμίσματος καταναλώνει το βαθμωτό του σε επαναλαμβανόμενες κλήσεις - παρατηρήστε ότι το $text μικραίνει κάθε φορά:
my $text = "the quick brown fox jumps over the lazy dog";
$^A = "";
formline '^<<<<<<<<<<<<<<<', $text;
formline "\n";
formline '^<<<<<<<<<<<<<<<', $text;
print $^A; # two lines, word-broken on spaces
$^A = "";
Αριθμητικό πεδίο με δεκαδικά και γέμισμα υπερχείλισης - μια τιμή που δεν χωρά αποδίδεται ως χαρακτήρες #:
$^A = "";
formline '@##.##', 3.14159;
formline "\n";
formline '@##.##', 9999.9; # overflow
print $^A; # " 3.14\n######\n"
$^A = "";
Οριακές περιπτώσεις#
Παράθεση της εικόνας: μέσα σε διπλά εισαγωγικά, το
@εισάγει παρεμβολή πίνακα. Γράψτε τις εικόνες ως συμβολοσειρές σε μονά εισαγωγικά ή ως heredocs με τερματιστή σε εισαγωγικά (<<'END') για να κρατήσετε το@κυριολεκτικό. Η κλασική παγίδα: τοformline "@<<<<<<<", $nameπαρεμβάλλει το@<προτού ηformlineδει καν τη συμβολοσειρά.Newlines στην εικόνα: η
formlineδεν ενδιαφέρεται για το πλήθος των newlines που περιέχει τοPICTURE. Τα σύμβολα~(απόκρυψη-αν-όλα-κενά) και~~(επανάληψη-έως-εξαντλήσεως) αντιμετωπίζουν ολόκληρη την εικόνα ως μία λογική γραμμή, οπότε μια μορφή εγγραφής με~~τυπικά χρειάζεται μίαformlineανά φυσική γραμμή. Μια δήλωσηformatχωρίζει μια πολυγραμμή φόρμα σε μία κλήσηformlineανά γραμμή εξόδου· όταν καλείτε απευθείας τηformline, κάνετε αυτό το χωρισμό μόνοι σας.Ο συσσωρευτής δεν καθαρίζεται: το πιο συνηθισμένο λάθος είναι να ξεχάσει κανείς να επαναφέρει το
$^Aμεταξύ λογικών χρήσεων. Η προσάρτηση είναι η ορισμένη συμπεριφορά, όχι σφάλμα. Χρησιμοποιήστεlocal $^A = "";μέσα σε βοηθητικές συναρτήσεις.Πλήθος πεδίων έναντι πλήθους τιμών: οι περισσευούμενες τιμές στη
LISTαγνοούνται σιωπηλά· οι ελλείπουσες τιμές αποδίδονται ως κενές (κανονικό πεδίο) ή κενώνονται (ειδικό αριθμητικό πεδίο^).Το
undefσε κανονικό πεδίο μετατρέπεται σε κενή συμβολοσειρά υπόuse warningsκαι πυροδοτεί προειδοποίησηuninitialized. Ένα ειδικό πεδίο (^###) κενώνει ολόκληρο το πεδίο σε undef χωρίς προειδοποίηση.Χρήση βαθμωτού μορφοποίησης - αποτύπωση της εξόδου της
write: το άνοιγμα ενός filehandle πάνω σε αναφορά βαθμωτού είναι συχνά ευκολότερο από την οδήγηση τηςformlineμε το χέρι:open my $fh, ">", \my $out or die $!; format FH = @<<<<<<<< @>>>> $name, $score . $~ = "FH"; select((select($fh), $~ = "FH")[0]); write $fh;
Καταφύγετε στη
formlineαπευθείας όταν θέλετε τη διαδρομή εικόνα-προς-συμβολοσειρά χωρίς εμπλοκή filehandle ή κατονομασμένης δήλωσηςformat.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
write- οδηγεί μία ή περισσότερες κλήσειςformlineαπό μια κατονομασμένηformatκαι εκκενώνει το$^Aσε filehandleformat- συντακτικό δήλωσης για τα ζεύγη εικόνας/τιμής που ηwriteτροφοδοτεί στηformlinesprintf- η άλλη πρωτογενής λειτουργία «μορφοποίηση σε συμβολοσειρά»· χρησιμοποιήστεsprintfγια οδηγίες%τύπουprintf,formlineγια στήλες αναφορών σταθερού πλάτους και μπλοκ κειμένου λειτουργίας γεμίσματος$^A- ο συσσωρευτής στον οποίο γράφει ηformline· διαβάστε τον για το αποτέλεσμα, καθαρίστε τον πριν την επόμενη λογική χρήση$:- χαρακτήρες στους οποίους μπορούν να σπάσουν τα πεδία λειτουργίας γεμίσματος (^*,^<<<)