, :
word => replacement
, '|'. (, "cat" "catogan" ), , sort reverse . (, "cat ++" ).
Regexp::Assemble . , .
, .
, , :
use strict;
use warnings;
use Test::More tests => 6;
use Regexp::Assemble;
my $mystring = "My cat likes to eat tomatoes.";
my $expected = "My dog likes to eat pasta.";
my $repl;
$repl= { 'cat' => 'dog', 'tomatoes' => 'pasta', };
is(
repl_simple($mystring, $repl),
$expected,
'look Ma, no module (simple)'
);
my $re= regexp_assemble($repl);
is(
repl_assemble($mystring, $re),
$expected,
'with Regex::Assemble (simple)'
);
$mystring = "My cat (catogan) likes to eat tomatoes.";
$expected = "My dog (doggie) likes to eat pasta.";
$repl= {'cat' => 'dog', 'tomatoes' => 'pasta', 'catogan' => 'doggie', };
is(
repl_simple($mystring, $repl),
$expected,
'no module, words overlap'
);
$re= regexp_assemble( $repl);
is(
repl_assemble($mystring, $re),
$expected,
'with Regex::Assemble, words overlap'
);
$mystring = "My cat (felines++) likes to eat tomatoes.";
$expected = "My dog (wolves--) likes to eat pasta.";
$repl= {'cat' => 'dog', 'tomatoes' => 'pasta', 'felines++' => 'wolves--', };
is(
repl_simple($mystring, $repl),
$expected,
'no module, meta-characters in expression'
);
$re= regexp_assemble( $repl);
is(
repl_assemble($mystring, $re),
$expected,
'with Regex::Assemble, meta-characters in expression'
);
sub repl_simple {
my( $string, $repl)= @_;
my $alternative= join( '|', reverse sort keys %$repl);
$string=~ s{($alternative)}{$repl->{$1}}ig;
return $string;
}
sub regexp_assemble {
my( $repl)= @_;
my $ra = Regexp::Assemble->new;
foreach my $alt (keys %$repl)
{ $ra->add( '\Q' . $alt . '\E'); }
return $ra->re;
}
sub repl_assemble {
my( $string, $re)= @_;
$string=~ s{($re)}{$repl->{$1}}ig;
return $string;
}
mirod source
share