אופרטורי איגוד regex#
שני אופרטורים שמקשרים מחרוזת עם פעולת ביטוי רגולרי. הם אינם מבצעים את ההתאמה בעצמם; הם רק אומרים ״הקלט של ביטוי זה הוא אותה מחרוזת״.
אופרטור | נקרא | שימוש |
|---|---|---|
| מתאים | לאגד פעולת regex ( |
| אינו מתאים | זהה, עם התוצאה הבוליאנית מנוגדת |
$str =~ /pattern/ # match: TRUE if $str contains a match
$str =~ s/foo/bar/ # substitution: returns count of changes
$str =~ tr/a-z/A-Z/ # transliteration: returns count
$str !~ /pattern/ # match negated: TRUE if NO match
ללא איגוד מפורש, פעולות regex פועלות על $_:
$_ = "hello";
print "match\n" if /h/; # implicit $_ binding
=~ ו־!~ הם הדרך להפנות מחדש את הקלט הזה למשתנה אחר.
מה הם מחזירים בפועל#
=~ מחזיר את מה שפעולת ה־regex בצד ימין הייתה מחזירה:
m//- בוליאני (אמת בהתאמה, שקר בהיעדר התאמה) בהקשר סקלר; הקבוצות הנלכדות בהקשר רשימה.s///- מספר ההחלפות שבוצעו (שהוא בוליאני־אמת כש־≥ 1).tr///- מספר התווים שעובדו.
!~ מחזיר את השלילה הבוליאנית, ללא תלות בפעולה הבסיסית. הוא משמש בעיקר עם m//:
print "no digit" if $str !~ /\d/;
print "$n changes" if $str =~ s/foo/bar/g;
my @hits = $str =~ /(\w+)/g; # list context: captures
שלושה שותפי פעולה#
=~ מקבל שלוש פעולות regex בצדו הימני:
m//- התאמה. ה־mאופציונלי כשהמתחמים הם לוכסנים:$s =~ /pattern/ו־$s =~ m{pattern}שניהם עובדים.s///- החלפה. שלושה חלקים: תבנית, החלפה, דגלים. מחזיר את מספר ההחלפות.tr///(ניתן לכתיבה גם כ־y///) - תעתוק. מחליף תווים אחד־לאחד בין שתי קבוצות תווים. מחזיר את מספר התווים שעובדו.
$line =~ /(\d+)/ # extract first run of digits
$line =~ s/^\s+// # strip leading whitespace
$line =~ s/\s+/ /g # collapse all whitespace to single spaces
$line =~ tr/A-Z/a-z/ # ASCII lowercase
!~ רק עם m//#
!~ משמעותי רק עם פעולת ההתאמה, מאחר שהחלפה ותעתוק מחזירים ספירות והמקרה של ״לא בוצעו שינויים״ הוא אפס משמעותי, לא בוליאני של ״לא התאים״. Perl יאפשר לכם לכתוב $s !~ s/.../.../, אך כמעט לעולם אינכם רוצים בכך - התוצאה !s/// היא ״אמת אם אפס החלפות״ שנקראת באופן מוזר. היצמדו ל־!~ /.../.
Lvalue מול rvalue#
=~ עצמו אינו משים. הוא רק מנתב את פעולת ה־regex שבצדו הימני אל המחרוזת שבצדו השמאלי. הפעולה עצמה עשויה לאחר מכן לשנות את המחרוזת - s/// ו־tr/// עושים זאת, m// לא - אך השינוי מגיע מהפעולה, לא מ־=~:
my $s = "hello";
$s =~ s/l/L/g; # mutates $s - now "heLLo"
my $n = $s =~ /(\w+)/; # does NOT mutate $s; $n is the boolean result
המחרוזת בצד שמאל של =~ חייבת להיות ניתנת לשינוי עבור s/// ו־tr///. מחרוזת מילולית או $1 (משתנה לכידת regex) ייכשלו עם ”Modification of a read-only value attempted“:
"hello" =~ s/l/L/g; # FATAL - literal is read-only
$1 =~ s/x/y/; # FATAL - capture variable is read-only
העתיקו תחילה אם עליכם לשנות מקור לקריאה בלבד:
(my $copy = $1) =~ s/x/y/; # idiom for "modify a copy of $1"
קדימות#
=~ ו־!~ יושבים בשורה 6 בטבלת הקדימות - הדוקים למדי, בין האונריים לבין אופרטורי הכפל. זו הסיבה שאתם יכולים לכתוב $s =~ /foo/ && $t =~ /bar/ בלי סוגריים סביב אף אחת מההתאמות.
הפניה צולבת להדרכה#
הדרכת הלוגיקה הבוליאנית מכסה את regex־כאלגברת־קבוצות בפרק היישומים שלה - חלופה כאיחוד, lookarounds כחיתוך ומשלים:
לוגיקה בוליאנית - יישומים (סעיף ביטויים רגולריים: לוגיקה על קבוצות מחרוזות)
מדריך העיון המלא לשפת ה־regex נמצא במדריך ה־regex: