in reply to using a regex which is in a string

s/b/c/g is not a regexp, it's a Perl expression. Only the b of s/b/c/g is a regexp.

eval is provided to execute Perl expressions:

$a = "aaabbbaaa"; $b = "s/b/c/g"; eval '$a =~ ' . $b;

or

local $_ = "aaabbbaaa"; $b = "s/b/c/g"; eval $b;

Unfortunately, eval EXPR can be used to execute any Perl expressions, even calls to system, for example. It would be safer if you were provided the regexp and the substitution parts seperately, as I mentioned in this node:

# Inputs # ====== $string = "aaabbbaaa"; $regexp = "b"; $subst = "c"; $global = 1; # (?i...) can be used in $regexp for /.../i # (?m...) can be used in $regexp for /.../m # (?s...) can be used in $regexp for /.../s # (?x...) can be used in $regexp for /.../x # /g cannot be stored in $regexp, thus the need for $global. # /e cannot be stored in $regexp, but I'm not supporting it. # Guts # ==== # Check user input. eval { # Let's explicitely be on the safe side. no re 'eval'; $regexp = qr/$regexp/; }; # Handle bad user input. die("Bad regexp supplied: $@\n") if $@; # Do the work. if ($global) { $string =~ s/$regexp/$subst/g; } else { $string =~ s/$regexp/$subst/; }

Known bugs: People mentioned that this does not provide a means of using $1, $2, etc in $subst.