Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Interpolation of capture buffers not working when regex stored in variable

by shmem (Canon)
on Jun 05, 2013 at 20:15 UTC ( #1037298=note: print w/ replies, xml ) Need Help??


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'


Comment on Re: Interpolation of capture buffers not working when regex stored in variable
Select or Download Code
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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1037298]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (2)
As of 2014-09-24 03:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (245 votes), past polls