אופרטורי איגוד regex#

שני אופרטורים שמקשרים מחרוזת עם פעולת ביטוי רגולרי. הם אינם מבצעים את ההתאמה בעצמם; הם רק אומרים ״הקלט של ביטוי זה הוא אותה מחרוזת״.

אופרטור

נקרא

שימוש

=~

מתאים

לאגד פעולת regex (m//, s///, tr///)

!~

אינו מתאים

זהה, עם התוצאה הבוליאנית מנוגדת

$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:

ראו גם#

  • m//, s///, tr///, qr//, split - צורות ה־perlfunc הצורכות regex.

  • $_ - משתנה הקלט בברירת מחדל כשלא ניתן איגוד.

  • משתני התאמת regex - $&, $1..$N, %+, @+, @-: את מה שכל התאמה מוצלחת ממלאת.