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 עבור המטפל הנבחר כעת