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"για την κλήση· χρησιμοποιήστε την όταν κάθε εγγραφή τελειώνει σε newlineprintf- ίδιοι κανόνες στόχευσης με τηνprint, αλλά το πρώτο όρισμα είναι συμβολοσειρά μορφήςsprintfκαι η$\δεν προστίθεταιsprintf- χτίζει τη μορφοποιημένη συμβολοσειρά χωρίς να τη γράψει· συνδυάστε μεprintόταν θέλετε να την καταγράψετε αλλού πρώταselect- αλλάζει σε ποιο filehandle γράφει η μορφή χωρίς όρισμα τηςprint$,- διαχωριστής πεδίων εξόδου που παρεμβάλλεται μεταξύ στοιχείων λίστας$\- διαχωριστής εγγραφών εξόδου που προστίθεται μετά τη λίστα$|- σημαία autoflush για το τρέχον επιλεγμένο handle