http://www.perlmonks.org?node_id=1037298


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
    We'd seen dispatch table mentioned in our design patterns book and it was one of the ideas we'd thought we'd pursue if we couldn't figure out the interpolation issue. Not having done a dispatch table before your code example will help--thanks. I'll read up on this for future reference.