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($1)/;
print "<b>Single default substitute</b> $textcopy\n";
$textcopy = $text;
$textcopy =~ s/(\s.)/uc($1)/e;
print "<b>Substitute and execute</b> $textcopy\n";
$textcopy = $text;
$textcopy =~ s/(\s.)/uc($1)/g;
print "<b>Global Substitute</b> $textcopy\n";
$textcopy = $text;
$textcopy =~ s/(\s.)/uc($1)/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 $1. An alternative would have been to backreference to it using \1. (written 2007-06-28, updated 2007-07-06)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
P212 - Perl - More on Character Strings [453] Commenting Perl regular expressions - (2005-09-30)
[583] Remember to process blank lines - (2006-01-31)
[586] Perl Regular Expressions - finding the position and length of the match - (2006-02-02)
[597] Storing a regular expression in a perl variable - (2006-02-09)
[608] Don't expose your regular expressions - (2006-02-15)
[737] Coloured text in a terminal from Perl - (2006-05-29)
[928] C++ and Perl - why did they do it THAT way? - (2006-11-16)
[943] Matching within multiline strings, and ignoring case in regular expressions - (2006-11-25)
[1222] Perl, the substitute operator s - (2007-06-08)
[1230] Commenting a Perl Regular Expression - (2007-06-12)
[1305] Regular expressions made easy - building from components - (2007-08-16)
[1336] Ignore case in Regular Expression - (2007-09-08)
[1510] Handling Binary data (.gif file example) in Perl - (2008-01-17)
[1727] Equality and looks like tests - Perl - (2008-07-29)
[1735] Finding words and work boundaries (MySQL, Perl, PHP) - (2008-08-03)
[1947] Perl substitute - the e modifier - (2008-12-16)
[2230] Running a piece of code is like drinking a pint of beer - (2009-06-11)
[2379] Making variables persistant, pretending a database is a variable and other Perl tricks - (2009-08-27)
[2657] Want to do a big batch edit? Nothing beats Perl! - (2010-03-01)
[2801] Binary data handling with unpack in Perl - (2010-06-10)
[2834] Teaching examples in Perl - third and final part - (2010-06-27)
[2874] Unpacking a Perl string into a list - (2010-07-16)
[2877] Further more advanced Perl examples - (2010-07-19)
[2993] Arrays v Lists - what is the difference, why use one or the other - (2010-10-10)
[3059] Object Orientation in an hour and other Perl Lectures - (2010-11-18)
[3100] Looking ahead and behind in Regular Expressions - double matching - (2010-12-23)
[3322] How much has Perl (and other languages) changed? - (2011-06-10)
[3332] DNA to Amino Acid - a sample Perl script - (2011-06-24)
[3411] Single and double quotes strings in Perl - what is the difference? - (2011-08-30)
[3546] The difference between dot (a.k.a. full stop, period) and comma in Perl - (2011-12-09)
[3630] Serialsing and unserialising data for storage and transfer in Perl - (2012-02-28)
[3650] Possessive Regular Expression Matching - Perl, Objective C and some other languages - (2012-03-12)
[3707] Converting codons via Amino Acids to Proteins in Perl - (2012-04-25)
[3927] First match or all matches? Perl Regular Expressions - (2012-11-19)
[4452] Binary data handling - Python and Perl - (2015-03-09)
Some other Articles
Interviewing job candidates in MelkshamComparing bus stopsKey new contactsWestbury Bypass - how it would effect MelkshamSubstitute operator / modifiers in PerlBusiness speed networking - a place tonight!Is this how to run a business for businesses?How NOT to oversell a hotelAn afternoon at a public enquiryAn oddball day. Strange experiences!