Διάφορα

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 σε filehandle

  • format - συντακτικό δήλωσης για τα ζεύγη εικόνας/τιμής που η write τροφοδοτεί στη formline

  • sprintf - η άλλη πρωτογενής λειτουργία «μορφοποίηση σε συμβολοσειρά»· χρησιμοποιήστε sprintf για οδηγίες % τύπου printf, formline για στήλες αναφορών σταθερού πλάτους και μπλοκ κειμένου λειτουργίας γεμίσματος

  • $^A - ο συσσωρευτής στον οποίο γράφει η formline· διαβάστε τον για το αποτέλεσμα, καθαρίστε τον πριν την επόμενη λογική χρήση

  • $: - χαρακτήρες στους οποίους μπορούν να σπάσουν τα πεδία λειτουργίας γεμίσματος (^*, ^<<<)