שונות

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 מזין ל־formline

  • sprintf - הפרימיטיב השני של ״עיצוב למחרוזת״; השתמש ב־sprintf עבור הוראות % בסגנון printf, ב־formline עבור עמודות דוח ברוחב קבוע ובלוקי טקסט במצב מילוי

  • $^A - הצובר ש־formline כותב אליו; קרא אותו עבור התוצאה, נקה אותו לפני השימוש הלוגי הבא

  • $: - תווים ששדות מצב מילוי (^*, ^<<<) רשאים לשבור עליהם