נניח שאתה מכין רשימת קניות וכותב

"2 כיכרות לחם"

ומוסר את הרשימה לבן/בת זוגך ואתה מקבל מייד כתגובה הודעת שגיאה על המרת טיפוס לא חוקית אחרי הכל, "2" במקרה זה הוא חלק ממחרוזת, לא מספר.

אירוע כזה ודאי מאוד יתסכל אותך.

המרת טיפוסי משתנים ב פרל

ברוב שפות התכנות סוג, או טיפוס, האופרנד - המשתנה או הערך שעליו מבצעים את הפעולה - מגדיר את התנהגות הפעולה. כלומר, חיבור שני מספרים היא פעולה חיבור מספרית, בעוד ש חיבור שתי מחרוזות משרשר אותן למחרוזת אחת. תכונה זו נקראת העמסת אופרטורים.

פרל לרוב עובדת בשיטה ההפוכה.

בפרל, האופרטור (הפעולה) קובע איך ישתמשו באופרנדים.

כלומר אם אתה משתמש בפעולה מספרית (למשל חיבור) אז שני הערכים יומרו אוטומטית למספרים אם אתה משתמש בפעולה על מחרוזות (למשל, שירשור מחרוזות) אז שני הערכים יומרו אוטומטית למחרוזות.

מתכנתי C ודאי יקראו להמרות כאלו casting אך זו מילה שלא משתמשים בה בעולם הפרל. ככל הנראה כיוון שכל ההמרות הן אוטומטית.

לפרל לא משנה אם אתה כותב משהו כמספר או כמחרוזת. פרל ממירה ביניהן אוטומטית לפי ההקשר.

ההמרה מספר => מחרוזת היא המרה קלה. פשוט צריך לדמיין שהסימן "" נוסף מסביב למספר.

ההמרה מחרוזת => מספר היא המרה שמעוררת קצת תהיות. אם המחרוזת נראית כמו מספר, אז זה קל. הערך המספרי הוא פשוט אותו דבר רק בלי הגרשיים

אם יש תו כלשהו שמונע מפרל להמיר את המחרוזת למספר, אז פרל תשתמש בכמה שיותר תווים מצד שמאל של המחרוזת בתור הערך המספרי ותתעלם מהיתר.

נראה מספר דוגמאות:

מקור   כמחרוזת   כמספר

  42         "42"        42
  0.3        "0.3"       0.3
 "42"        "42"        42
 "0.3"       "0.3"       0.3

 "4z"        "4z"        4        (*)
 "4z3"       "4z3"       4        (*)
 "0.3y9"     "0.3y9"     0.3      (*)
 "xyz"       "xyz"       0        (*)
 ""          ""          0        (*)
 "23\n"      "23\n"      23

בכל המקרים שבהם ההמרה ממחרוזת למספר אינה מושלמת, פרט למקרה האחרון, פרל תוציא אזהרה. כמובן, בהנחה שהפעלתם את use warnings כפי שמומלץ לעשות.

דוגמה

אחרי שראינו את הטבלה, נראה איך זה נראה בקוד:

use strict;
use warnings;

my $x = "4T";
my $y = 3;

השירשור ממיר את שני הערכים למחרוזות

print $x . $y;    # 4T3

פעולת החיבור המספרית ממירה את שני הערכים למספרים

print $x + $y;  # 7
                # Argument "4T" isn't numeric in addition (+) at ...

Argument isn't numeric (הארגומנט אינו מספרי)

זו האזהרה שמקבלים כשפרל מנסה להמיר מחרוזת למספר וההמרה אינה מושלמת.

לפרל יש עוד מספר אזהרות והודעות שגיאה נפוצות. למשל Global symbol requires explicit package name and Use of uninitialized value.

איך להמנע מהאזהרות?

טוב שפרל מזהירה (אם מבקשים ממנה) כשההמרה לא הייתה מושלמת, אבל האם אין איזו פונקציה כמו is_number שיכולה לבדוק אם המחרוזת היא אכן מספר?

כן ולא.

לפרל אין פונקציית is_number כיוון שקיומה של הפונקציה מהווה מעין התחייבות שמפתחי פרל יודעים מהו מספר. למרבה הצער בשאר העולם אין ממש הסכמה בסוגיה זו. בחלק מהשיטות ".2" מקובל כמספר, בחלקן הוא לא נחשב למספר. אפילו "2." לא מקובל בכל הקשר, ובכל שיטה כמספר.

יש הקשרים שבהם אפילו 0xAB נחשב למספר מספר הקסדצימלי, בסיס 16.

לכן הפונקציה is_number אבל יש פונקציה קצת פחות מתחייבת שנקראת looks_like_number. נראה כמו מספר

וזה בדיוק כמו שזה נראה הפונקציה בודקת אם מחרוזת נתונה נראית לפרל כמו מספר.

הפונקציה היא חלק המודול Scalar::Util וניתן להשתמש בה כך:

use strict;
use warnings;

use Scalar::Util qw(looks_like_number);

print "How many loaves of bread shall I buy? ";
my $loaves = <STDIN>;
chomp $loaves;

if (looks_like_number($loaves)) {
    print "I am on it...\n";
} else {
    print "Sorry, I don't get it\n";
}

ואל תשכח גם את החלב!