Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask

Re: Apply A Set Of Regexes To A String

by atcroft (Monsignor)
on Oct 11, 2004 at 02:42 UTC ( #398083=note: print w/replies, xml ) Need Help??

in reply to Apply A Set Of Regexes To A String

If the regexen are mutually exclusive (ie, they do not affect the same things), then perhaps something along the lines of the following:

my %regexen = ( '*' => [ { 'replace' => qr/blah/, 'with' => 'duh' }, { 'replace' => qr/baz/, 'with' => 'quuz' }, { 'replace' => qr/(b)ar/, 'with' => '$1um' } ], 'cgi-bin' => [ { 'replace' => qr!usr/local/bin/perl!, 'with' => 'usr/bin/perl' } ] ); foreach my $directory ( '*', 'cgi-bin' ) { foreach my $file ( glob("$directory/*") ) { next if ( $file =~ m/\.(jpg|png|gif|zip|gz|jar|pl|bak|\~)$/i ); print "Processing... $file (old file as ${file}.bak\n"; open( INF, $file ) or die("Can't open $file for input: $!\n"); open( OUTF, '>' . $file . '.new' ) or die("Can't open $ for output: $!\n"); binmode(INF); binmode(OUTF); while ( my $line = <INF> ) { foreach my $rx ( @{ $regexen{$directory} } ) { $line =~ s/$rx->{'replace'}/$rx->{'with'}/; } print OUTF $line; } close(INF); close(OUTF); rename( $file, $file . '.bak' ); rename( $file . '.new', $file ); } }

This would loop thru a directory at a time, making changes to each file (and saving the original with a .bak extension). The only problem with the code above is if the modifications affect the same things, in which case if all modifications affect all files, you would add them under the '*' set, otherwise you would have to add them to the set for each of the directories (or files, if you need to break it down in that way).

I'm not sure if this is necessarily the best way, but it is an idea. Hope it helps.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://398083]
[LanX]: buongiorno!
[Discipulus]: buongiorno a te!
[choroba]: LanX ciao! BTW, yesterday evening I arrived home in my new car ;-)
[Discipulus]: it seems some signal is issued but only by services
[Discipulus]: which one choroba?

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2017-01-17 09:27 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (154 votes). Check out past polls.