סקלרים ומחרוזות

chomp#

מסיר את מפריד רשומת הקלט הגורר ממחרוזת במקום.

chomp מסיר כל תת־מחרוזת גוררת המתאימה לערך הנוכחי של $/ מהארגומנט שלו ומחזיר את המספר הכולל של תווים שהוסרו בכל ארגומנט שבו נגע. הוא מוטטו את הארגומנט שלו; ערך ההחזרה הוא מונה, לא המחרוזת המקוטמת. אם לא ניתן ארגומנט, הוא פועל על $_. chomp הוא המקבילה הבטוחה יותר של chop: הוא מסיר את המפריד רק אם הוא באמת שם, והוא מכבד את $/ ולכן עושה את הדבר הנכון על קבצים המסתיימים ללא שורה חדשה סופית או המשתמשים בסיומת רשומה שאינה שורה חדשה.

תקציר#

chomp VARIABLE
chomp( LIST )
chomp

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

המספר הכולל של תווים שהוסרו, כמספר שלם. לרוב 0 (לא היה מפריד) או 1 ("\n" יחיד הוסר תחת $/ ברירת המחדל). כאשר $/ הוא מחרוזת רב־תווית, chomp מוצלח מחזיר את אורכה. כאשר מבצעים chomp על רשימה, המונה מסוכם על פני כל אלמנט.

הערך המקוטם חי במשתנה שהעברתם; קוראים ל־chomp עבור תופעת הלוואי, לא עבור ערך ההחזרה שלו:

my $line = "hello\n";
my $n = chomp $line;        # $line is "hello", $n is 1

מצב גלובלי שהוא נוגע בו#

  • $/ - מפריד רשומת קלט. chomp קורא את $/ בכל קריאה ומסיר הופעה גוררת של הערך הנוכחי שלו. שינוי $/ משנה את מה ש־chomp מסיר; זה לרוב מה שרוצים כשמגדירים $/ כדי לקרוא רשומות עם מתחם מותאם.

  • $_ - נצרך כארגומנט ברירת המחדל כש־chomp נקרא ללא ארגומנט. chomp; בתוך while (<>) { ... } הוא הניב הקנוני.

  • איטרטור האש - chomp על האש מאפס את האיטרטור each שלו (ראו מקרי קצה).

דוגמאות#

השימוש היומיומי - הסרת השורה החדשה הגוררת מהקלט:

while (my $line = <$fh>) {
    chomp $line;
    # process $line without the trailing "\n"
}

צורת ללא־הארגומנט פועלת על $_:

while (<>) {
    chomp;                          # removes "\n" from $_
    my @fields = split /:/;
}

chomp של הצבת lvalue - סוגריים נדרשים כדי שהארגומנט ל־chomp יהיה ההצבה כולה, לא רק המשתנה:

chomp(my $cwd    = `pwd`);          # strip "\n" from command output
chomp(my $answer = <STDIN>);        # strip "\n" from user input

chomp של רשימה - כל אלמנט מקוטם והמונה הכולל מוחזר:

my @lines = ("a\n", "b\n", "no-nl");
my $n = chomp @lines;               # @lines = ("a", "b", "no-nl"), $n = 2

מפריד רשומה מותאם - chomp עוקב אחרי כל מה ש־$/ מוגדר אליו:

local $/ = "\r\n";
my $line = "GET / HTTP/1.0\r\n";
chomp $line;                        # removes "\r\n", returns 2

מצב פסקה - $/ = "" גורם ל־chomp להסיר את כל השורות החדשות הגוררות מהמחרוזת:

local $/ = "";
my $para = "line one\nline two\n\n\n";
chomp $para;                        # $para is "line one\nline two"

מקרי קצה#

  • No separator present: a no-op. Returns 0 and leaves the argument unchanged. This is the whole point of chomp over chop

    • safe to call on strings that may or may not end in $/.

  • ארגומנט undef: chomp על סקלר לא־מוגדר משאיר אותו לא־מוגדר ומחזיר 0. תחת use warnings זה פולט אזהרת uninitialized.

  • ארגומנט האש: chomp %h מבצע chomp על כל ערך (לא על המפתחות) ומאפס את האיטרטור each של האש. לולאת while (my ($k, $v) = each %h) בתהליך על %h תיפגע.

  • מצב slurp ($/ = undef) ומצב רשומה באורך קבוע ($/ מוגדר להפניה למספר שלם): chomp לא מסיר דבר ומחזיר 0. אין מושג של מפריד גורר במצבים אלה.

  • מלכודת סוגריים בהצבה: ללא סוגריים, chomp נקשר חזק יותר מ־=:

    chomp  $cwd = `pwd`;                # parsed as (chomp $cwd) = `pwd`;
    chomp( $cwd = `pwd` );              # what you meant
    

    אותה מלכודת עם רשימת פסיקים חשופה:

    chomp  $x, $y;                      # parsed as chomp($x), $y;
    chomp( $x, $y );                    # chomps both
    
  • כל lvalue עובד, לא רק סקלרים פשוטים. אלמנטי מערך ואלמנטי האש, פרוסות, dereference-ים, וביטויי הצבה - כולם יעדים חוקיים.

  • קבועים וערכים לקריאה־בלבד: chomp על מחרוזת לקריאה־בלבד גורם croak עם Modification of a read-only value attempted. ליטרלי מחרוזת הם לקריאה־בלבד.

  • $/ רב־בייט: chomp משווה בייטים של המחרוזת מול בייטים של $/. אם המחרוזת ו־$/ חולקים על קידוד (לאחד דגל UTF-8 מוגדר, לשני לא), ההתאמה נעשית על ייצוג הבייטים הפנימי ועלולה להפתיע. יש לשמור את שני הצדדים באותו קידוד.

הבדלים מ־upstream#

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

ראו גם#

  • chop - הסרת התו האחרון ללא תנאי והחזרתו; כלי ישן וגס יותר שהוחלף על־ידי chomp לניקוי קלט

  • split - לעיתים קרובות הצעד הבא לאחר chomp, מפצל את הרשומה הקצוצה עתה לשדות

  • readline / <> - קורא רשומות המסתיימות ב־$/; chomp מבטל את הסיומת ש־readline הותיר במקום

  • each - איטרטור ההאש ש־chomp %hash מאפס

  • $/ - מפריד רשומת קלט; chomp קורא אותו בכל קריאה

  • $_ - ארגומנט ברירת המחדל כש־chomp נקרא ללא יעד מפורש