I/O

print#

Γράφει μια λίστα τιμών σε ένα filehandle.

Η print είναι η καθημερινή πρωτογενής λειτουργία εξόδου. Μετατρέπει κάθε στοιχείο της LIST σε συμβολοσειρά, τα ενώνει με την τρέχουσα τιμή της $, (του διαχωριστή πεδίων εξόδου, συνήθως κενού), τα γράφει στο FILEHANDLE και τελικά προσθέτει την $\ (τον διαχωριστή εγγραφών εξόδου, συνήθως κενό). Αν παραλειφθεί το FILEHANDLE, η έξοδος πηγαίνει στο τρέχον επιλεγμένο handle (βλ. select), που εξ ορισμού είναι το STDOUT. Αν παραλειφθεί η LIST, τυπώνεται η $_.

Σύνοψη#

print LIST
print FILEHANDLE LIST
print {EXPR} LIST
print

Τι επιστρέφεται#

1 σε επιτυχία, undef σε αποτυχία (με την $! ορισμένη). Η τιμή επιστροφής σπάνια ελέγχεται - οι περισσότερες κλήσεις print στοχεύουν στο STDOUT ή στο STDERR, και μια αποτυχία εγγραφής σε οποιοδήποτε από τα δύο είναι ήδη συνθήκη τερματισμού του προγράμματος. Ελέγξτε την τιμή επιστροφής όταν γράφετε σε αρχείο, σωλήνα ή υποδοχή όπου έχουν σημασία οι μερικές εγγραφές και οι σπασμένοι σωλήνες.

print $fh @records
    or die "write to $path failed: $!";

Προεπιλεγμένο filehandle, προεπιλεγμένοι διαχωριστές#

Τρία κομμάτια καθολικής κατάστασης διαμορφώνουν κάθε κλήση print:

  • Το τρέχον επιλεγμένο filehandle, που αλλάζει με την select. Η print LIST (χωρίς ρητό filehandle) γράφει εκεί. Στην έναρξη του προγράμματος είναι το STDOUT.

  • $, - διαχωριστής πεδίων εξόδου, παρεμβάλλεται μεταξύ των στοιχείων της λίστας. Προεπιλογή είναι η κενή συμβολοσειρά, οπότε η print 1, 2, 3 παράγει 123, όχι 1 2 3. Επίσης γνωστή ως $OFS υπό use English.

  • $\ - διαχωριστής εγγραφών εξόδου, προστίθεται μετά από ολόκληρη τη λίστα. Προεπιλογή είναι η κενή συμβολοσειρά, οπότε η print δεν προσθέτει newline. Επίσης γνωστή ως $ORS υπό use English.

Ο ορισμός και των δύο δίνει σημασιολογία print τύπου Python:

local $, = " ";
local $\ = "\n";
print 1, 2, 3;          # "1 2 3\n"

Χρησιμοποιήστε local όταν αλλάζετε αυτές μέσα σε υπορουτίνα ώστε η αλλαγή να μη διαρρεύσει στον καλούντα.

Η say είναι ακριβώς print με την $\ αναγκαστικά σε "\n" για εκείνη τη μία κλήση - καταφύγετε σε αυτήν όταν θέλετε newline κάθε φορά και δεν θέλετε να αγγίξετε την $\.

Παραδείγματα#

Βασική εγγραφή στο STDOUT:

print "hello, world\n";

Εγγραφή σε filehandle με τη μορφή έμμεσου αντικειμένου. Παρατηρήστε: κανένα κόμμα ανάμεσα στο filehandle και τη λίστα:

open my $fh, ">", "out.txt" or die $!;
print $fh "line 1\n", "line 2\n";
close $fh;

Εγγραφή σε filehandle που κρατείται σε έκφραση. Οποιοδήποτε filehandle πιο σύνθετο από bareword ή απλό βαθμωτό χρειάζεται τη μορφή μπλοκ {EXPR}:

my @logs = (\*STDOUT, \*STDERR);
print { $logs[$level] } "message\n";

Ένωση στοιχείων λίστας με την $, και τερματισμός της εγγραφής με την $\:

local $, = ", ";
local $\ = ".\n";
print "apples", "pears", "plums";   # "apples, pears, plums.\n"

Λίστα που περιέχει undef - κάθε undef μετατρέπεται σε συμβολοσειρά ως κενή συμβολοσειρά και ενεργοποιεί προειδοποίηση uninitialized υπό use warnings:

use warnings;
my $x;
print "value=", $x, "\n";           # "value=\n" plus a warning

Περιβάλλον λίστας έναντι βαθμωτού περιβάλλοντος. Ο @arr σε θέση LIST επεκτείνεται στα στοιχεία του· τυλίξτε σε scalar για να τυπώσετε το πλήθος αντί:

my @arr = (10, 20, 30);
print @arr, "\n";                   # "102030\n"
print scalar @arr, "\n";            # "3\n"

Καταστολή της προειδοποίησης undef για ένα μπλοκ όπου οι τιμές που λείπουν είναι αναμενόμενες και προορίζονται να εμφανιστούν ως κενές:

no warnings 'uninitialized';
print join(",", @row), "\n";        # empty fields render as ""

Οριακές περιπτώσεις#

  • Κανένα όρισμα: η print; τυπώνει την $_ στο επιλεγμένο handle. Χρησιμοποιείται ιδιωματικά μέσα σε while (<>) { print; }.

  • Η αμφισημία filehandle-ή-πρώτο-όρισμα: η Perl αποφασίζει αν το πρώτο token είναι filehandle κατά την ανάλυση, όχι από τον τύπο χρόνου εκτέλεσης. Ένα bareword ή απλή βαθμωτή μεταβλητή που ακολουθείται αμέσως από όρο (χωρίς κόμμα) λαμβάνεται ως filehandle:

    print STDERR "oops\n";            # STDERR is the filehandle
    print $fh "oops\n";               # $fh is the filehandle
    

    Μια έκφραση που επιστρέφει filehandle δεν λειτουργεί σε εκείνη τη θέση - η print $handles[0] "x" είναι συντακτικό σφάλμα. Χρησιμοποιήστε τη μορφή μπλοκ: print { $handles[0] } "x".

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

    print localtime(), "\n";          # prints nine numbers, no spaces
    print scalar localtime(), "\n";   # prints the familiar date string
    
  • Η print (…) αναλύεται ως κλήση συνάρτησης. Η print (2+3)*4 τυπώνει 5 και κατόπιν απορρίπτει το *4. Βάλτε σε παρενθέσεις ολόκληρη τη λίστα ορισμάτων, ή προθέστε +:

    print((2+3)*4);                   # prints 20
    print +(2+3)*4;                   # prints 20
    
  • Κλειστό filehandle: επιστρέφει undef και θέτει την $! σε "Bad file descriptor". Υπό use warnings εκπέμπεται προειδοποίηση print() on closed filehandle.

  • Στρώματα κωδικοποίησης: η print γράφει ό,τι λέει να γράψει η στοίβα PerlIO του handle. Αν το handle έχει στρώμα :utf8 ή :encoding(...), οι συμβολοσειρές κωδικοποιούνται κατά την έξοδο. Τα handles σε κατάσταση bytes περιμένουν συμβολοσειρές bytes· το πέρασμα συμβολοσειράς με wide characters γράφει ωμά codepoints και εκπέμπει προειδοποίηση Wide character in print.

  • Autoflush: η print εντάμιεύει μέσω PerlIO. Ορίστε την $| στο επιλεγμένο handle ώστε να εκκενώνεται μετά από κάθε εγγραφή - συνήθως απαιτείται για έξοδο προόδου σε σωλήνες ή κατά τον συντονισμό με άλλη διεργασία:

    $| = 1;                           # autoflush current handle
    
  • Η εκτύπωση σε κλειστό σωλήνα ή υποδοχή εγείρει SIGPIPE. Η προεπιλεγμένη ενέργεια είναι ο τερματισμός της διεργασίας· εγκαταστήστε χειριστή ($SIG{PIPE} = 'IGNORE' ή μια sub) ώστε να τη μετατρέψετε σε κανονική αποτυχία εγγραφής που μπορείτε να ελέγξετε.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • say - print με την $\ αναγκαστικά σε "\n" για την κλήση· χρησιμοποιήστε την όταν κάθε εγγραφή τελειώνει σε newline

  • printf - ίδιοι κανόνες στόχευσης με την print, αλλά το πρώτο όρισμα είναι συμβολοσειρά μορφής sprintf και η $\ δεν προστίθεται

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

  • select - αλλάζει σε ποιο filehandle γράφει η μορφή χωρίς όρισμα της print

  • $, - διαχωριστής πεδίων εξόδου που παρεμβάλλεται μεταξύ στοιχείων λίστας

  • $\ - διαχωριστής εγγραφών εξόδου που προστίθεται μετά τη λίστα

  • $| - σημαία autoflush για το τρέχον επιλεγμένο handle