format#
Δηλώνει ένα πρότυπο αναφοράς βασισμένο σε εικόνα προς χρήση από την write.
Η format είναι δήλωση, όχι εκτελέσιμη εντολή. Συνδέει μια ονοματισμένη εικόνα - ένα μπλοκ από γραμμές εξόδου σταθερών στηλών με ενσωματωμένους δείκτες πεδίων - στον πίνακα συμβόλων, όπου αργότερα η write την αναζητά με το όνομά της. Οι εικόνες δεν παρεμβάλλουν μεταβλητές· κάθε γραμμή εικόνας ακολουθείται από μια γραμμή ορισμάτων, οι εκφράσεις της οποίας γεμίζουν τα πεδία με τη σειρά. Η format είναι παλαιό χαρακτηριστικό της Perl· το upstream σημειώνει ότι η χρήση της είναι περιορισμένη και παραπέμπει στο perlform για την πλήρη γραμματική των πεδίων.
Σύνοψη#
format NAME =
FORMLIST
.
format = # declares the "STDOUT" format
FORMLIST
.
Μια FORMLIST είναι μια ακολουθία γραμμών, καθεμία από τρία είδη: σχόλιο (# στη στήλη 1), γραμμή εικόνας, ή γραμμή ορισμάτων που παρέχει τιμές για τη γραμμή εικόνας ακριβώς από πάνω της. Ένα μοναδικό . στη στήλη 1 τερματίζει τη δήλωση.
Τι επιστρέφεται#
Η format είναι δήλωση και δεν έχει τιμή κατά τον χρόνο εκτέλεσης. Εγκαθιστά τη μεταγλωττισμένη εικόνα στον πίνακα μορφών (format table) του τρέχοντος πακέτου με το όνομα NAME (ή STDOUT αν παραλειφθεί το NAME). Δεν καλείται· ενεργοποιείται έμμεσα από την write.
Τα κομμάτια μιας εικόνας#
Κάθε γραμμή εικόνας αναμειγνύει κυριολεκτικό κείμενο με δείκτες πεδίων. Ένα πεδίο αρχίζει με @ (κανονικό πεδίο) ή ^ (ειδικό πεδίο, που χρησιμοποιείται για τη λειτουργία γεμίσματος και για αριθμητικά πεδία με δυνατότητα να μένουν κενά) και εκτείνεται μέσω χαρακτήρων γεμίσματος που ορίζουν τόσο το πλάτος όσο και τη στοίχιση:
<- κείμενο αριστερής στοίχισης>- κείμενο δεξιάς στοίχισης|- κεντραρισμένο κείμενο#- αριθμητικό με δεξιά στοίχιση· ένα προπορευόμενο0γεμίζει με μηδενικά· το.τοποθετεί την υποδιαστολή...- στο τέλος πεδίου κειμένου, αποδίδει τρεις τελείες όταν η τιμή έχει αποκοπεί@*- πεδίο μεταβλητού πλάτους που εκπέμπει αυτούσιο ένα πολυγραμμικό βαθμωτό^*- πεδίο μεταβλητού πλάτους που εκπέμπει την επόμενη γραμμή ενός βαθμωτού και καταναλώνει αυτό το τμήμα της μεταβλητής πηγής
Δύο σύμβολα καταστολής μπορούν να εμφανιστούν οπουδήποτε σε μια γραμμή εικόνας και δεν αποτελούν μέρος κανενός πεδίου:
~- αν κάθε πεδίο σε αυτήν τη γραμμή είναι κενό, η γραμμή καταστέλλεται εξ ολοκλήρου· διαφορετικά το ίδιο το~αποδίδεται ως κενό~~- όπως το~, και επιπλέον επαναλαμβάνει τη γραμμή μέχρι να εξαντληθεί κάθε πεδίο της (κάθε βαθμωτό πηγής να είναι κενό ή κάθε έκφραση τύπουshiftνα επιστρέφει undef)
Το perlform.pod δίνει την πλήρη γραμματική των γραμμών εικόνας συμπεριλαμβανομένης της λειτουργίας γεμίσματος, των πολυγραμμικών πεδίων, της υπερχείλισης (####) και των εξαρτημένων από locale υποδιαστολών.
Η γραμμή ορισμάτων#
Η γραμμή αμέσως κάτω από μια γραμμή εικόνας είναι η γραμμή ορισμάτων: μια λίστα εκφράσεων χωρισμένων με κόμματα, μία ανά πεδίο, η οποία αξιολογείται σε περιβάλλον λίστας πριν αποδοθεί η εικόνα. Μια μοναδική έκφραση που επιστρέφει λίστα μπορεί να γεμίσει πολλαπλά πεδία. Η λίστα ορισμάτων μπορεί να διασπαστεί σε πολλές γραμμές αν και μόνο αν το πρώτο σύμβολο στην πρώτη γραμμή είναι άγκιστρο ανοίγματος:
format Report =
@<<<<<<<< @>>>>>>
{ $name,
$score }
.
Καθολικές μεταβλητές που ελέγχουν την write#
Η έξοδος μέσω της format οδηγείται εξ ολοκλήρου από καθολικές μεταβλητές ανά filehandle. Καθεμία είναι προσαρτημένη στο τρέχον επιλεγμένο filehandle· η αλλαγή τους για άλλο handle απαιτεί έναν χορό select (βλέπε παρακάτω):
$~- όνομα της τρέχουσας μορφής που χρησιμοποιείται για κάθε εγγραφή (προεπιλογή είναι το ίδιο το όνομα του filehandle)$^- όνομα της τρέχουσας μορφής κορυφής σελίδας (προεπιλογή είναι το όνομα του filehandle με προσαρτημένο_TOP)$=- μήκος σελίδας σε γραμμές (προεπιλογή 60)$-- γραμμές που απομένουν στην τρέχουσα σελίδα· ηwriteτο μειώνει και ενεργοποιεί τη μορφή κορυφής σελίδας όταν φτάσει στο μηδέν$%- τρέχων αριθμός σελίδας, αυξάνεται αυτόματα$:- χαρακτήρες πάνω στους οποίους μπορεί να σπάει η λειτουργία γεμίσματος (^) (προεπιλογή" \n-")$^L- συμβολοσειρά που εκπέμπεται πριν από κάθε κορυφή σελίδας εκτός της πρώτης (προεπιλογή"\f")
Υπό το use English αυτές είναι οι $FORMAT_NAME, $FORMAT_TOP_NAME, $FORMAT_LINES_PER_PAGE, $FORMAT_LINES_LEFT, $FORMAT_PAGE_NUMBER, $FORMAT_LINE_BREAK_CHARACTERS και $FORMAT_FORMFEED.
Επειδή αυτές είναι ανά handle, ο ορισμός τους για handle διαφορετικό από το τρέχον επιλεγμένο χρειάζεται select:
my $ofh = select $fh;
$~ = 'Report';
$^ = 'Report_TOP';
select $ofh;
Κορυφή φόρμας#
Όταν η write μειώσει το $- στο μηδέν, εκπέμπει το $^L (εκτός από την πρώτη σελίδα), επανατοποθετεί το $- σε $=, αυξάνει το $% και επικαλείται τη μορφή που ονομάζει το $^. Το προεπιλεγμένο όνομα μορφής κορυφής σελίδας είναι το όνομα του filehandle με προσαρτημένο _TOP, οπότε η δήλωση του STDOUT_TOP αρκεί για εγγραφές μέσω του STDOUT.
Παραδείγματα#
Μια ελάχιστη αναφορά με κεφαλίδα:
format STDOUT_TOP =
Inventory
Name Qty Price
----------------------------
.
format STDOUT =
@<<<<<<<<<<<<< @>> @##.##
$name, $qty, $price
.
for my $row (@rows) {
($name, $qty, $price) = @$row;
write;
}
Εναλλαγή μορφών για handle που δεν είναι επιλεγμένο:
open my $fh, '>', 'report.txt' or die $!;
my $ofh = select $fh;
$~ = 'Report';
$^ = 'Report_TOP';
select $ofh;
write $fh;
Λειτουργία γεμίσματος με ~~ για να αποστραγγίσετε ένα πολυγραμμικό βαθμωτό μία γραμμή τη φορά:
format STDOUT =
Note: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$note
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$note
.
Τα πεδία ^ καταναλώνουν το $note καθώς αποδίδονται· η γραμμή ~~ επαναλαμβάνεται μέχρι το $note να είναι κενό.
Οριακές περιπτώσεις#
Λεξιλογική ορατότητα: μια format βλέπει μια μεταβλητή
myμόνο όταν δηλώνεται μέσα στην εμβέλεια αυτής της μεταβλητής. Μια format ανώτατου επιπέδου δεν μπορεί να δει μεταβλητέςmyδηλωμένες μέσα σε υπορουτίνα· χρησιμοποιήστε καθολικές μεταβλητές πακέτου ή δηλώστε την format μέσα στην υπορουτίνα.Εικόνες σε εισαγωγικά: αν κατασκευάσετε μια εικόνα με
evalαπό συμβολοσειρά με διπλά εισαγωγικά, το@nameφαίνεται ως παρεμβολή πίνακα. Διαφύγετέ το ή χρησιμοποιήστε μονά εισαγωγικά γύρω από το πρότυπο.Μια μοναχική
.είναι ο τερματιστής: μια εικόνα της οποίας το κυριολεκτικό κείμενο θα ξεκινούσε με.στη στήλη 1 πρέπει να εσοχίζει αυτήν τη γραμμή. Αυτό επίσης τσιμπάει κώδικα format που στέλνεται μέσω αφελών συστημάτων μεταφοράς αλληλογραφίας που κόβουν στο.σε γραμμή μόνο του.Αριθμητική υπερχείλιση: ένα πεδίο
#στενότερο από τον μορφοποιημένο αριθμό αποδίδεται ως####αντί να αποκόπτεται σιωπηρά.Υποδιαστολή locale: αν το
use localeήταν σε ισχύ όταν δηλώθηκε η format, τοLC_NUMERICεπιλέγει τον χαρακτήρα υποδιαστολής. Η εναλλαγή τουuse localeκατά τη στιγμή τηςwriteδεν αλλάζει την εικόνα.Χαρακτήρες ελέγχου μέσα σε πεδίο κειμένου σταθερού πλάτους αντικαθίστανται από κενά για να διατηρηθεί η στοίχιση στηλών.
Ανάμειξη
printκαιwrite: νόμιμη στο ίδιο handle, αλλά το$-παρακολουθεί μόνο τις γραμμές που εκπέμπει ηwrite. Προσαρμόστε το$-χειροκίνητα αν εναλλάξιμη έξοδοςprintκαταναλώνει γραμμές σελίδας για τις οποίες ενδιαφέρεστε.Δεν υπάρχει μηχανισμός υποσέλιδου: δεν υπάρχει
$FORMAT_BOTTOM_NAME. Τα υποσέλιδα γίνονται χειροκίνητα - ελέγξτε το$-πριν από κάθεwriteκαι εκπέμψτε εσείς το υποσέλιδο όταν φτάσει σε κατώφλι.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
write- αποδίδει μία εγγραφή μέσω της τρέχουσας μορφής στο επιλεγμένο filehandle· ο μόνος τρόπος με τον οποίο μια δηλωμένη format παράγει έξοδοselect- αλλάζει ποιο filehandle είναι το τρέχον, απαιτείται όταν ορίζετε τα$~,$^,$=,$-,$%,$:ή$^Lγια handle διαφορετικό από τοSTDOUT$~- όνομα της τρέχουσας μορφής$^- όνομα της τρέχουσας μορφής κορυφής σελίδας$=- μήκος σελίδας$-- γραμμές που απομένουν στην τρέχουσα σελίδα$%- τρέχων αριθμός σελίδας$:- χαρακτήρες διακοπής σε λειτουργία γεμίσματοςperlform.pod- πλήρης γραμματική γραμμών εικόνας, κανόνες λειτουργίας γεμίσματος, εσωτερικάformline/$^A, και επεξεργασμένα παραδείγματα αναφορών