in reply to Interpolation of capture buffers not working when regex stored in variable
Any ideas to make capture groups work when patterns defined in INI?
Try
use Config::IniFiles; my $global_ini_data = Config::IniFiles->new( -file => "test.ini" ); my $regex = $global_ini_data->val( 'client1', 'rename' ); my $filename = "201306051200foobar.dat"; eval "sub vodoo { \$_[0] =~ $regex }"; vodoo ( $filename ); # this does in-place edit. print $filename,$/; __END__ 060520.1200foobar.dat
If you want a string to be a command, you have to compile it - with string eval. Just the same way as any other perl source is compiled.
update
I admit no having read through all of your code. If you have only one substitution per filename, you could get around with
eval "\$filename =~ $regex"; die $@ if $@;
Having multiple patterns and clients, you surely don't want to have a named subroutine for each of them. You could construct a dispatch table with
sub makesub { # my ($client, $regex) = @_; update: wrong, we have 1 param my $regex = shift; my $sub = eval "sub { \$_[0] =~ $regex }"; die $@ if $@; return $sub; }
and populate a hash with the client identifier as key and the resulting anonymous sub as value, which you then call. Like so:
$hash{$client} = makesub($regex); $hash{$client}->($filename); # $filename changed
perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: Interpolation of capture buffers not working when regex stored in variable
by jacklh (Initiate) on Jun 06, 2013 at 01:01 UTC |
In Section
Seekers of Perl Wisdom