I/O

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 - ίδιοι κανόνες στόχευσης και διαχωριστή, αλλά προσαρτά την $\ (κενή προεπιλεγμένα) αντί για εξαναγκασμένο newline

  • printf - μορφοποιημένη έξοδος· δεν προσαρτά newline, το βάζετε εσείς στη συμβολοσειρά μορφής

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

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

  • $\ - διαχωριστής εγγραφών εξόδου· η say τον αγνοεί και αντ” αυτού προσαρτά "\n"

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