בכל שפת תיכנות חשוב להבין את השימוש במחרוזות, אך בפרל הן חלק ממהותה של השפה. בייחוד אם תיקחו בחשבון שאחד מהפירושים הרטרואקטיביים לשם Perl הוא Practical Extraction and Reporting Language - (שפת חילוץ נתונים ויצירת דוחות) ואילו פעולות שדורשות הרבה מחרוזות.
ניתן לכתוב מחרוזות בין גרשיים בודדים '
או בין גרשיים כפולים "
ותהיה להן התנהגות קצת שונה בשני המקרים.
מחרוזות בגרשיים בודדים
אם כותבים מחרוזות בין גרשיים בודדים '
, אז כמעט כל התווים,
פרט לגרש עצמו '
,
מתפרשים כפי שהם כתובים בקוד.
my $name = 'Foo';
print 'Hello $name, how are you?\n';
הפלט יהיה:
Hello $name, how are you?\n
מחרוזות בגרשיים כפולים
מחרוזות שנכתבות בגרשיים כפולים "
מאפשרות אינטרפולציה
(משתנים אחרים שמשולבים כחלק מהמחרוזת יוחלפו על ידי התוכן שלהם),
כמו כן תווי בקרה מיוחדים מוחלפים לדוגמה, \n
מוחלף על ידי שורה חדשה
ו- \t
על ידי טאב.
my $name = 'Foo';
my $time = "today";
print "Hello $name,\nhow are you $time?\n";
הפלט יהיה:
Hello Foo,
how are you today?
יש לשים לב שיש \n
מיד אחרי הפסיק, ועוד אחד בסוף המחרוזת.
כשמדובר במחרוזות פשוטות כמו 'Foo' and "today" שאין בהן תווים כמו$
, @
, ו- \
זה לא משנה באילו גרשיים משתמשים.
שתי השורות הבאות יוצרות תוצאות זהות:
$name = 'Foo';
$name = "Foo";
כתובות דואר אלקטרוני (דוא"ל)
כיוון שהסימן @
הוא אחד הסימנים שעובר אינטרפולציה במחרוזות בגרשיים כפולים, כתיבת כתובות דוא"ל דורשת קצת יותר תשומת לב.
בגרשיים בודדים @
לא עובר אינטרפולציה.
בגרשיים כפולים הקוד יגרום לשגיאה: Global symbol "@bar" requires explicit package name at ... line ... ולאזהרה: Possible unintended interpolation of @bar in string at ... line ...
האזהרה נותנת לנו רמז טוב יותר לבעיה האמיתית.
use strict;
use warnings;
my $broken_email = "foo@bar.com";
הקוד הבא, לעומת זאת, יעבוד נכון, כיוון שכתובת הדוא"ל מופיעה בגרשיים בודדים.
use strict;
use warnings;
my $good_email = 'foo@bar.com';
מה עושים אם רוצים אינטרפולציה של משתנים סקלריים אבל גם רוצים להשתמש בסימן השטרודל @
במחרוזת?
use strict;
use warnings;
my $name = 'foo';
my $good_email = "$name\@bar.com";
print $good_email; # foo@bar.com
תמיד אפשר לסמן את התווים המיוחדים, במקרה זה סימן השטרודל, באמצעות תו הנקרא @
תו escape
שהוא הקו הנטוי שמאלה (back-slash) \
.
שילוב סימן הדולר $ במחרוזות בגרשיים כפולים.
בדומה לכך אם רוצים לשלב את סימן הדולר $
במחרוזות בגרשיים כפולים, ניתן לעשות זאת בעזרת תו escape:
use strict;
use warnings;
my $name = 'foo';
print "\$name = $name\n";
יודפס:
$name = foo
לעשות escape ל-escape
במקרים נדירים ייתכן שתרצה לשלב גם את הקו הנטוי השמאלי במחרוזת.
אם תכתוב אותו \
כחלק ממחרוזת, (בין אם היא בגרשיים בודדים או כפולים),
פרל תחשוב שאתה רוצה לעשות escape לתו שבא אחריו, ותפעל בהתאם.
אבל אין מה לדאוג. אפשר להגיד לפרל לא לעשות את זה על ידי שימוש בתו על עצמו:
פשוט שמים עוד קו נטוי שמאלי לפניו:
use strict;
use warnings;
my $name = 'foo';
print "\\$name\n";:w
\foo
אני יודע שה-escape הכפול הזה נראה קצת מוזר, אך כך זה עובד גם בכל שפת תיכנות אחרת.
אם אתה רוצה להבין את כל הסיפור הזה עם ה-escape, נסה משהו כזה:
print "\\\\n\n\\n\n";
תסתכל מה מודפס:
\\n
\n
aונסה להסביר את זה לעצמך.
לעשות escape לגרשיים כפולים
ראינו שאפשר לשים משתנים סקליים במחרוזות בגרשיים כפולים אבל אפשר גם לעשות escape על סימן הדולר $
.
ראינו איך משתמשים בסימן ה-escape\
ואפילו איך אפשר להשתמש בו על עצמו.
אבל מה אם רוצים להדפיס גרשיים כפולים במחרוזת בגרשיים כפולים?
This code has a syntax error:
use strict;
use warnings;
my $name = 'foo';
print "The "name" is "$name"\n";
כשפרל רואה את הגרש הכפול לפני המילה "name" היא חושבת שזה סוף המחרוזת ומתלוננת על כך ש-name היא מילה חשופה (bareword).
כפי שודאי כבר ניחשת, צריך לעשות escapeg לתו "
:
use strict;
use warnings;
my $name = 'foo';
print "The \"name\" is \"$name\"\n";
וזה מה שיודפס:
The "name" is "foo"
זה עובד, אבל זה לא ממש קריא.
האופרטור qq
זה המקום שבו אפשר להשתמש באופרטור qq
או האופטור double-q (q כפול):
use strict;
use warnings;
my $name = 'foo';
print qq(The "name" is "$name"\n);
לעין לא מיומנת , qq() עשוי להיראות כמו קריאה לפונקציה, אבל זו אינה קריאה לפונקציה. qq
הוא אופרטור
ומייד נראה מה עוד הוא יודע לעשות, אבל קודם כל אסביר מה קורה.
אנחנו מחליפים את הגרשיים הכפולים "
שקודם הקיפו את המחרוזת בסוגריים של האופרטור qq
. המשמעות של זה היא שלגרשיים כפולים אין משמעות מיוחדת במחרוזת, לכן אין צורך לעשות להן escape.
כתוצאה מכך הקוד הרבה יותר קריא.
הייתי אפילו אומר שהוא יפה, אם לא הייתי חושש מזעמם של מתכנתי פייתון.
אבל מה אם רוצים לשלב סוגריים במחרוזת?
use strict;
use warnings;
my $name = 'foo';
print qq(The (name) is "$name"\n);
אין בעיה. כל זמן שהסוגריים מאוזנים,
(כלומר לכל פתיחת סוגריים (
, יש סגירת סוגריים מתאימה)
,
ופתיחת הסוגריים היא תמיד לפני סגירת הסוגריים) פרל תבין את המחרוזת.
אני יודע עכשיו בטח תרצה לשבור את זה, על ידי כתיבת סגור-סוגריים ללפני פתח-סוגריים:
use strict;
use warnings;
my $name = 'foo';
print qq(The )name( is "$name"\n);
ואכן פרל תתריע על שגיאה ש- "name" היא ) bareword מילה חשופה (. אפילו פרל לא יכולה להבין הכל.
כמובן שאפשר לעשות escape לסוגריים\)
and \(
, אבל שם כבר היינו.
לא תודה!
חייבת להיות שיטה טובה יותר!
כזכור, כתבתי ש- qq
הוא אופרטור ולא פונקציה? אז אפשר לעשות איתו כל מיני טריקים, נכון?
מה יקרה אם נחליף את הסוגריים הרגילים בסוגריים מסולסלים? {}
:
use strict;
use warnings;
my $name = 'foo';
print qq{The )name( is "$name"\n};
זה עובד ומדפיס בדיוק את המחרוזת שרצינו:
The )name( is "foo"
(לא שאני יודע למה מישהו ירצה להדפיס משהו כזה...)
אז מישהו מהשורה השניה מרים את ידו, ושואל מה אם רוצים גם סוגריים וגם סוגריים מסולסלים במחרוזת, וגם רוצים שהם לא יהיו מאוזנים?
משהו כזה, נכון?
use strict;
use warnings;
my $name = 'foo';
print qq[The )name} is "$name"\n];
ומה שמודפס זה:
The )name} is "foo"
ודאי יש שימוש כלשהו גם לסוגריים המרובעים.
האופרטור q, q-בודד
בדומה ל- qq
קיים אופרטור נוסף שנקרא q
.
גם הוא מאפשר לבחור את התווים הסוגרים של המחרוזת שלך אך הוא מתפקד כגרש בודד
'
: כלומר הוא לא עושה אינטרפולציה על משתנים.
use strict;
use warnings;
print q[The )name} is "$name"\n];
מדפיס:
The )name} is "$name"\n