formline#
מעצב רשימת ערכים לתוך מחרוזת תמונה ומוסיף את התוצאה לצובר ה־format $^A.
formline הוא המנוע ברמה הנמוכה מאחורי מנגנון הדוחות format / write של Perl. הוא לוקח מחרוזת PICTURE המתארת רוחבי שדה ויישור, משבץ את הערכים מ־LIST לתוך אותם שדות, ומוסיף את הטקסט שנוצר לצובר הגלובלי $^A (ידוע גם כ־$ACCUMULATOR תחת use English). כל קריאה ל־write פולטת את $^A למטפל הקובץ המשויך ומנקה אותו; מחוץ ל־write, אתה מנהל את $^A בעצמך - קרא אותו עבור הטקסט המעוצב, אז אפס אותו ל־"" לפני הקריאה הבאה.
PICTURE היא אותה שפת־משנה ש־format משתמש בה: @<<<< עבור שדה טקסט מיושר לשמאל, @>>>> עבור מיושר לימין, @|||| עבור ממורכז, @####.## עבור שדה מספרי מיושר לימין עם נקודה עשרונית, @* עבור שדה טקסט רב־שורתי בלתי־מוגבל, ו־^<<< (וחבריו) עבור שדה מצב מילוי הצורך את ארגומנט הסקלר שלו בהדרגה. ראה perldoc perlform עבור אוצר המילים המלא של התמונה.
תקציר#
formline PICTURE, LIST
formline $picture, @values
מה מקבלים בחזרה#
formline תמיד מחזיר 1. הפלט השימושי הוא תופעת הלוואי: הטקסט המעוצב מוסף ל־$^A. אם אתה צריך את הטקסט כערך, קרא את $^A לאחר הקריאה ואז נקה אותו:
$^A = "";
formline '@<<<<<<<< @>>>>', $name, $score;
my $line = $^A;
$^A = "";
כי התוצאה הולכת לצובר, קריאות formline רצופות בונות פלט רב־שורתי ללא join ביניים כלשהו.
מצב גלובלי שהוא נוגע בו#
$^A- צובר ה־format.formlineמוסיף אליו; הוא לעולם לא מנוקה אוטומטית. ידוע גם כ־$ACCUMULATORתחתuse English.$:- קבוצת התווים שעליהם שדות מצב מילוי (^*,^<<<) רשאים לשבור. ברירת המחדל היא" \n-". ידוע גם כ־$FORMAT_LINE_BREAK_CHARACTERSתחתuse English.locale של
LC_NUMERIC- אםuse localeבתוקף בזמן הידור התמונה, תו הנקודה העשרונית בשדות מספריים (@###.##) עוקב אחר ה־locale.שדות מצב מילוי (
^…) משנים את ארגומנטי הסקלר שלהם במקום, חותכים את החלק שנצרך כך שהקריאה הבאה שלformlineממשיכה היכן שהקודמת הסתיימה. העבר עותק אם אתה צריך שהמקורי יישמר.
דוגמאות#
בנה שורה מעוצבת אחת וקרא אותה בחזרה:
$^A = "";
formline '@<<<<<<<< @>>>>>', "widget", 42;
print $^A, "\n"; # "widget 42\n"
$^A = "";
בנה בלוק רב־שורתי בקריאה אחת - התמונה עשויה להכיל שורות חדשות, וכל שורה של התמונה צורכת ערכים משלה מ־LIST:
$^A = "";
formline <<'END', "Alice", 30, "Bob", 25;
@<<<<<<<<<< @###
@<<<<<<<<<< @###
END
print $^A; # "Alice 30\nBob 25\n"
$^A = "";
עוזר swrite - formline הוא ל־write מה ש־sprintf הוא ל־printf:
sub swrite {
my $picture = shift;
local $^A = "";
formline $picture, @_;
return $^A;
}
my $row = swrite '@<<<<<<<< @>>>>', "total", 1234;
שדה מצב מילוי צורך את הסקלר שלו על פני קריאות חוזרות - שים לב ש־$text מתכווץ בכל פעם:
my $text = "the quick brown fox jumps over the lazy dog";
$^A = "";
formline '^<<<<<<<<<<<<<<<', $text;
formline "\n";
formline '^<<<<<<<<<<<<<<<', $text;
print $^A; # two lines, word-broken on spaces
$^A = "";
שדה מספרי עם מקומות עשרוניים ומילוי הצפה - ערך שאינו מתאים מוצג כתווי #:
$^A = "";
formline '@##.##', 3.14159;
formline "\n";
formline '@##.##', 9999.9; # overflow
print $^A; # " 3.14\n######\n"
$^A = "";
מקרי קצה#
ציטוט התמונה: בתוך מרכאות כפולות,
@מציג שיבוץ מערך. כתוב תמונות כמחרוזות במרכאות יחידות או heredocs עם מסיים מצוטט (<<'END') כדי לשמור על@מילולי. המלכודת הקלאסית:formline "@<<<<<<<", $nameמשבץ את@<לפני ש־formlineבכלל רואה את המחרוזת.שורות חדשות בתמונה: ל־
formlineלא אכפת כמה שורות חדשותPICTUREמכיל. הטוקנים~(דכא אם הכל ריק) ו־~~(חזור עד מיצוי) מתייחסים לכל התמונה כשורה לוגית אחת, כך שפורמט רשומה עם~~בדרך כלל זקוק ל־formlineאחד לכל שורה פיזית. הצהרתformatמפצלת form רב־שורתי לקריאתformlineאחת לכל שורת פלט; כאשר קוראים ל־formlineישירות, אתה עושה את הפיצול הזה בעצמך.הצובר אינו מנוקה: הטעות הנפוצה ביותר היא לשכוח לאפס את
$^Aבין שימושים לוגיים. הוספה היא ההתנהגות המוגדרת, לא באג. השתמש ב־local $^A = "";בתוך עוזרים.ספירת שדות לעומת ספירת ערכים: ערכים עודפים ב־
LISTמתעלמים מהם בשקט; ערכים חסרים מוצגים כריק (שדה רגיל) או כמרוקן (שדה מספרי מיוחד^).undefבשדה רגיל ממיר למחרוזת ריקה תחתuse warningsומפעיל אזהרתuninitialized. שדה מיוחד (^###) מרוקן את כל השדה על undef ללא אזהרה.שימוש בסקלר format - לכידת פלט
write: פתיחת מטפל קובץ על הפניית סקלר היא לעיתים קרובות קלה יותר מהפעלתformlineידנית:open my $fh, ">", \my $out or die $!; format FH = @<<<<<<<< @>>>> $name, $score . $~ = "FH"; select((select($fh), $~ = "FH")[0]); write $fh;
פנה ל־
formlineישירות כאשר אתה רוצה את מסלול התמונה־למחרוזת ללא מעורבות של מטפל קובץ או הצהרתformatבעלת שם.
הבדלים מ־upstream#
תואם מלא ל־upstream Perl 5.42.
ראו גם#
write- מפעיל קריאתformlineאחת או יותר מ־formatבעל שם ופולט את$^Aלמטפל קובץformat- תחביר ההצהרה לזוגות תמונה/ערך ש־writeמזין ל־formlinesprintf- הפרימיטיב השני של ״עיצוב למחרוזת״; השתמש ב־sprintfעבור הוראות%בסגנוןprintf, ב־formlineעבור עמודות דוח ברוחב קבוע ובלוקי טקסט במצב מילוי$^A- הצובר ש־formlineכותב אליו; קרא אותו עבור התוצאה, נקה אותו לפני השימוש הלוגי הבא$:- תווים ששדות מצב מילוי (^*,^<<<) רשאים לשבור עליהם