Main Content

Substitute operator / modifiers in Perl

Archive - Originally posted on "The Horse's Mouth" - 2007-06-28 07:46:12 - Graham Ellis

Perl's substitute operator lets you replace a Regular Expression with another string within a target string. For example

$hello = "Grating";
$hello =~ s/a/ee/;
print "$hello\n";


Will turn Grating into Greeting within the $hello variable. You'll note that you can use almost any special character in place of the "/" delimiter, and that (unusually but not uniquely) the =~ operator in this use actually changes the content of the incoming variable.

There's a further "twist" to the substitute syntax too. What are those extra letters that you sometimes see at the end? If you add a "modifier" letter after the final delimiter, you can alter the behaviour of the whole substitution.

Modifier g is Global - replace ALL matches not just the first
modifier e is Execute - perform the output string as a piece of code
modifier i instruct Perl to ignore case in matching
modifier x tells Perl to treat spaces in the regular expression as comments
modifier s tells Perl to have . (full stop) match new line as well as anything else
modifier m tells Perl to have ^ and $ match at embedded new lines within the string.

Here's an example showing the syntax and effect of the e and g modifiers:

# Use of the s (substitute) operator
# Showing the "e" and "g" modifiers
 
$text = 'a little \piece of \bread and butter';
print "<b>Base text</b> $text\n";
 
$textcopy = $text;
$textcopy =~ s/(\s.)/uc()/;
print "<b>Single default substitute</b> $textcopy\n";
 
$textcopy = $text;
$textcopy =~ s/(\s.)/uc()/e;
print "<b>Substitute and execute</b> $textcopy\n";
 
$textcopy = $text;
$textcopy =~ s/(\s.)/uc()/g;
print "<b>Global Substitute</b> $textcopy\n";
 
$textcopy = $text;
$textcopy =~ s/(\s.)/uc()/eg;
print "<b>Global substitute and execute</b> $textcopy\n";



which generates

Base text a little \piece of \bread and butter
Single default substitute auc( l)ittle \piece of \bread and butter
Substitute and execute a Little \piece of \bread and butter
Global Substitute auc( l)ittleuc( \)pieceuc( o)fuc( \)breaduc( a)nduc( b)utter
Global substitute and execute a Little \piece Of \bread And Butter


My example uses ( .... )within the regular expression to capture part of the incoming string for use in the outgoing string, where I've reference back to it using . An alternative would have been to backreference to it using .