say#
Εκτυπώνει λίστα τιμών ακολουθούμενη από newline.
Η say είναι print με τον διαχωριστή εγγραφών εξόδου εξαναγκασμένο σε "\n" για εκείνη τη μία κλήση. Μετατρέπει κάθε αντικείμενο της LIST σε συμβολοσειρά, τα ενώνει με την $, (διαχωριστής πεδίων εξόδου, συνήθως κενός), τα γράφει στο FILEHANDLE, και προσαρτά κυριολεκτικό "\n" - όχι την τιμή της $\. Αν το FILEHANDLE παραλείπεται, η έξοδος πηγαίνει στο τρέχον επιλεγμένο handle (δείτε την select), που έχει προεπιλογή STDOUT. Αν η LIST παραλείπεται, εκτυπώνεται η $_.
Η say είναι ενσωματωμένη feature-gated. Είναι διαθέσιμη μόνο όταν το χαρακτηριστικό "say" είναι ενεργοποιημένο - αυτόματα υπό use v5.10 ή υψηλότερα, ή ρητά με use feature 'say' - ή όταν καλείται ως CORE::say.
Σύνοψη#
say LIST
say FILEHANDLE LIST
say {EXPR} LIST
say
Τι επιστρέφεται#
1 σε επιτυχία, undef σε αποτυχία (με την $! τεθειμένη). Όπως και με την print, η τιμή επιστροφής σπάνια ελέγχεται για STDOUT ή STDERR. Ελέγξτε την όταν γράφετε σε αρχείο, σωλήνα ή υποδοχή όπου αποτυχία εγγραφής είναι ανακτήσιμη κατάσταση:
say $fh $record
or die "write to $path failed: $!";
Προεπιλεγμένο filehandle, προεπιλεγμένοι διαχωριστές#
Η say διαβάζει την ίδια καθολική κατάσταση με την print, με μία σκόπιμη εξαίρεση:
Το τρέχον επιλεγμένο filehandle, που αλλάζει με την
select. Ηsay LISTγράφει εκεί όταν δεν δίνεται filehandle. ΠροεπιλογήSTDOUT.$,- διαχωριστής πεδίων εξόδου, παρεμβαλλόμενος μεταξύ στοιχείων της λίστας. Προεπιλογή η κενή συμβολοσειρά, οπότε ηsay 1, 2, 3παράγει"123\n", όχι"1 2 3\n".$\- διαχωριστής εγγραφών εξόδου. Ηsayαγνοεί την$\εντελώς και αντ” αυτού προσαρτά κυριολεκτικό"\n". Η ρύθμιση της$\δεν έχει επίδραση στηνsay.
Αυτό το τελευταίο σημείο είναι ο όλος λόγος που υπάρχει η say: μία εγγραφή, ένα newline, χωρίς πειραματισμούς με την $\.
Παραδείγματα#
Βασική εγγραφή στο STDOUT:
use feature 'say';
say "hello, world"; # "hello, world\n"
Εγγραφή σε filehandle. Ίδια μορφή έμμεσου αντικειμένου με την print - χωρίς κόμμα μεταξύ του filehandle και της λίστας:
open my $fh, ">", "out.txt" or die $!;
say $fh "line 1";
say $fh "line 2";
close $fh;
Εγγραφή σε filehandle που κρατιέται σε έκφραση. Κάθε filehandle πιο σύνθετο από bareword ή απλό βαθμωτό χρειάζεται τη μορφή μπλοκ {EXPR}:
my @logs = (\*STDOUT, \*STDERR);
say { $logs[$level] } "message";
Η say ενώνει τα στοιχεία της λίστας με την $, και μετά προσαρτά "\n" ανεξαρτήτως της $\:
local $, = ", ";
local $\ = ".\n"; # ignored by say
say "apples", "pears", "plums"; # "apples, pears, plums\n"
Χωρίς ορίσματα - εκτυπώνει την $_ συν newline. Το filehandle πρέπει να είναι bareword σε αυτή τη μορφή· η say $fh; θα ανέλυε το $fh ως το περιεχόμενο, όχι ως τον στόχο:
for (qw(alpha beta gamma)) {
say; # "alpha\n", "beta\n", "gamma\n"
}
Το περιβάλλον λίστας ισχύει για κάθε όρισμα:
my @arr = (10, 20, 30);
say @arr; # "102030\n"
say scalar @arr; # "3\n"
Οριακές περιπτώσεις#
Πύλη χαρακτηριστικού: χωρίς
use feature 'say'ήuse v5.10, ηsayαναλύεται ως κοινή κλήση υπορουτίνας και θα αποτύχει κατά τη μεταγλώττιση αν δεν υπάρχει τέτοια sub εντός εμβέλειας. ΧρησιμοποιήστεCORE::say(...)για να την καλέσετε χωρίς συνθήκη.Χωρίς ορίσματα με ρητό filehandle: η
say FH;εκτυπώνει την$_στοFH, αλλά μόνο για bareword filehandles. Ηsay $fh;αναλύει το$fhως το περιεχόμενο, όχι τον στόχο - γράψτεsay $fh $_;αν αυτό εννοείτε. Αυτό ταιριάζει με τηνprint.Η
$\αγνοείται, δεν παρακάμπτεται: ηsayδεν θέτει ούτεlocalοποιεί την$\. Άλλος κώδικας που διαβάζει την$\(συμπεριλαμβανομένων εμφωλευμένων κλήσεωνprint) βλέπει όποια τιμή ήταν ήδη εκεί.Αμφισημία filehandle-ή-πρώτου-ορίσματος: ίδιος κανόνας με την
print. Ένα bareword ή απλό βαθμωτό που ακολουθείται αμέσως από όρο (χωρίς κόμμα) λαμβάνεται ως filehandle. Έκφραση που επιστρέφει filehandle χρειάζεται τη μορφή μπλοκ:say { $handles[0] } "x";.Η
say (…)αναλύεται ως κλήση συνάρτησης. Ηsay (2+3)*4εκτυπώνει5και μετά απορρίπτει το*4. Βάλτε ολόκληρη τη λίστα ορισμάτων σε παρενθέσεις, ή προθέστε με+:say((2+3)*4); # "20\n" say +(2+3)*4; # "20\n"
Κλεισμένο filehandle: επιστρέφει
undefκαι θέτει την$!σε"Bad file descriptor". Υπόuse warningsεκπέμπεται προειδοποίησηsay() on closed filehandle.Στρώματα κωδικοποίησης: η
sayγράφει μέσω της στοίβας PerlIO του handle ακριβώς όπως ηprint. Handle με στρώμα:utf8ή:encoding(...)κωδικοποιεί κατά την έξοδο· το προσαρτημένο newline είναι ένα μόνο byte"\n"και κωδικοποιείται από το ίδιο στρώμα. Συμβολοσειρά με ευρείς χαρακτήρες που γράφεται σε handle σε λειτουργία bytes πυροδοτεί προειδοποίησηWide character in say.Autoflush: η
sayενταμιεύει μέσω PerlIO όπως ηprint. Θέστε την$|στο επιλεγμένο handle για έξοδο ενταμιευμένη γραμμή-γραμμή.SIGPIPE: η εγγραφή σε κλειστό σωλήνα ή υποδοχή εγείρειSIGPIPE. Η προεπιλεγμένη ενέργεια τερματίζει τη διεργασία· εγκαταστήστε χειριστή για να το μετατρέψετε σε κανονική αποτυχία εγγραφής.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
print- ίδιοι κανόνες στόχευσης και διαχωριστή, αλλά προσαρτά την$\(κενή προεπιλεγμένα) αντί για εξαναγκασμένο newlineprintf- μορφοποιημένη έξοδος· δεν προσαρτά newline, το βάζετε εσείς στη συμβολοσειρά μορφήςselect- αλλάζει σε ποιο filehandle γράφει η μορφή χωρίς όρισμα τηςsay$,- διαχωριστής πεδίων εξόδου που παρεμβάλλεται μεταξύ στοιχείων λίστας· ηsayτον τιμά$\- διαχωριστής εγγραφών εξόδου· ηsayτον αγνοεί και αντ” αυτού προσαρτά"\n"$|- σημαία autoflush για το τρέχον επιλεγμένο handle