Here is a solution using eval. Some care is required in using escapes. It works with or without the OO interface.
use strict;
use warnings;
use Test::More tests => 2;
my $pattern = '\Aabc\/';
my $replacement = '123\/';
my $flags = 'i';
my $value = 'ABC/def';
my $expected = '123/def';
my $command = "\$value =~ s/$pattern/$replacement/$flags";
diag $command;
eval $command;
ok( $value eq $expected, 'use eval directly' );
$value = 'ABC/def';
my $re = new Regexp($pattern);
$value = $re->substitute( $value, $replacement, $flags );
ok( $value eq $expected, 'use eval in class' );
package Regexp;
sub new {
my ( $class, $pattern ) = @_;
my $new_object = bless \$pattern, $class;
return $new_object;
}
sub substitute {
my ( $self, $value, $replacement, $flags ) = @_;
my $pattern = $$self;
my $command = "\$value =~ s/$pattern/$replacement/$flags";
main::diag $command;
eval $command;
return $value;
}
OUTPUT:
1..2
# $value =~ s/\Aabc\//123\//i
ok 1 - use eval directly
# $value =~ s/\Aabc\//123\//i
ok 2 - use eval in class