קלט/פלט

say#

הדפסת רשימת ערכים ואחריהם newline.

say הוא print עם מפריד רשומות הפלט המאולץ ל־"\n" עבור אותה קריאה. הוא ממיר כל פריט ב־LIST למחרוזת, מצרף אותם עם $, (מפריד שדות הפלט, בדרך־כלל ריק), כותב אותם ל־FILEHANDLE, ומוסיף "\n" ליטרלי - לא את הערך של $\. אם FILEHANDLE מושמט, הפלט הולך למטפל הקובץ הנבחר כעת (ראו select), שברירת המחדל שלו היא STDOUT. אם LIST מושמט, $_ מודפס.

say הוא built-in מוגן בשער תכונה. הוא זמין רק כאשר תכונת "say" מופעלת - אוטומטי תחת use v5.10 או גבוה יותר, או מפורש עם use feature 'say' - או כאשר נקרא כ־CORE::say.

תקציר#

say LIST
say FILEHANDLE LIST
say {EXPR} LIST
say

מה מקבלים בחזרה#

1 בהצלחה, undef בכישלון (עם $! שנקבע). כמו עם print, ערך ההחזרה נבדק לעיתים נדירות עבור STDOUT או STDERR. יש לבדוק אותו בעת כתיבה לקובץ, pipe או socket שבהם כשל כתיבה הוא תנאי הניתן להתאוששות:

say $fh $record
    or die "write to $path failed: $!";

מטפל קובץ ברירת מחדל, מפרידים ברירת מחדל#

say קורא את אותו מצב גלובלי כמו print, עם יוצא־דופן מכוון אחד:

  • מטפל הקובץ הנבחר כעת, משתנה עם select. say LIST כותב לשם כאשר לא ניתן מטפל קובץ. ברירת המחדל היא 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"

כתיבה למטפל קובץ. אותה צורת אובייקט עקיף כמו print - ללא פסיק בין מטפל הקובץ לבין הרשימה:

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

כתיבה למטפל קובץ המוחזק בביטוי. כל מטפל קובץ מורכב יותר מ־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. מטפל הקובץ חייב להיות 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 מתפענח כקריאה לתת־שגרה רגילה וייכשל בזמן הידור אם אין תת־שגרה כזו בתחום. יש להשתמש ב־CORE::say(...) כדי לקרוא לו ללא תנאי.

  • ללא ארגומנטים עם מטפל קובץ מפורש: say FH; מדפיס $_ ל־FH, אבל רק עבור מטפלי קובץ bareword. say $fh; מפענח את $fh כתוכן, לא כיעד - יש לכתוב say $fh $_; אם זוהי הכוונה. זה תואם את print.

  • $\ מתעלמים ממנו, לא דורסים אותו: say אינו קובע ולא מבצע local ל־$\. קוד אחר שקורא את $\ (כולל קריאות print מקוננות) רואה את הערך שכבר היה שם.

  • עמימות בין מטפל־קובץ לבין ארגומנט־ראשון: אותו כלל כמו print. bareword או סקלר פשוט שאחריו מיד term (ללא פסיק) נלקח כמטפל הקובץ. ביטוי שמחזיר מטפל קובץ דורש את צורת הבלוק: say { $handles[0] } "x";.

  • say (…) מתפענח כקריאת פונקציה. say (2+3)*4 מדפיס 5 ואז משליך את *4. יש לעטוף את כל רשימת הארגומנטים בסוגריים, או להקדים +:

    say((2+3)*4);                     # "20\n"
    say +(2+3)*4;                     # "20\n"
    
  • מטפל קובץ סגור: מחזיר undef וקובע את $! ל־"Bad file descriptor". תחת use warnings מנופקת אזהרה say() on closed filehandle.

  • שכבות קידוד: say כותב דרך מחסנית ה־PerlIO של המטפל בדיוק כמו print. מטפל עם שכבת :utf8 או :encoding(...) מקודד בדרך החוצה; ה־newline המוסף הוא בית "\n" יחיד ומקודד על־ידי אותה שכבה. מחרוזת תווים רחבים שנכתבת למטפל במצב־בתים מפעילה אזהרה Wide character in say.

  • Autoflush: say עושה buffering דרך PerlIO כמו print. יש לקבוע את $| במטפל הנבחר עבור פלט עם buffering לפי שורה.

  • SIGPIPE: כתיבה ל־pipe או socket סגור מעלה SIGPIPE. הפעולה ברירת המחדל מסיימת את התהליך; יש להתקין מטפל כדי להמיר אותו לכשל כתיבה רגיל.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • print - אותם כללי כיוון ומפרידים, אך מוסיף את $\ (ריק כברירת מחדל) במקום newline מאולץ

  • printf - פלט מפורמט; אינו מוסיף newline, יש להכניס אחד למחרוזת הפורמט

  • select - לשנות לאיזה מטפל קובץ הצורה ללא־ארגומנטים של say כותבת

  • $, - מפריד שדות הפלט המוכנס בין פריטי רשימה; say מכבד אותו

  • $\ - מפריד רשומות הפלט; say מתעלם ממנו ומוסיף "\n" במקום

  • $| - דגל autoflush עבור המטפל הנבחר כעת