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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|