Otogi has asked for the wisdom of the Perl Monks concerning the following question:

I want to create a script that applies regex rules that are in a database to text files. Is there a way to load regex into a data strucute and then applying it to the text depending on what the user requested. If so how to do that and is there a module that does what I need. There can also be the case where more than one regex rule is applied on a file and saves them in parameters.

Thank you in advance

Replies are listed 'Best First'.
Re: Load regex
by GrandFather (Saint) on Feb 15, 2006 at 22:21 UTC

    The following sample uses a text file to store rules that are applied to a second text file. The database details you can probably sort out for yourself - the technique maps easily.

    use strict; use warnings; # First generate a sample data file open (outFile, '>', "delme.txt") or die "Can't create test file: $!"; print outFile <<DATA; Server: win1 ID: D: Space: 6496911360 Server: ux22 ID: D: Space: 7973826560 Server: del2 ID: U: Space: 7973228544 Server: del3 ID: U: Space: 3973228544 DATA close outFile; # Now a file of match patterns open (outFile, '>', "delme.regex") or die "Can't create test file: $!" +; print outFile <<DATA; Space:(\b3\\d+) ServerD:Server: (?i:d) ID:ID: (\\w+) DATA close outFile; #Now the solution code my %matchPatterns; my $matchType = shift; #Build the pattern table open inFile, '<', "delme.regex"; while (<inFile>) { chomp; $matchPatterns{$1} = $2 if /(\w+):(.*)/; } close inFile; if (! defined $matchType) { print "Match type must be one of:\n", join ' ', sort keys %matchPatt +erns; exit -1; } #Scan the text file open inFile, '<', 'delme.txt'; while (<inFile>) { chomp; print "$_\n" if /$matchPatterns{$matchType}/; } close inFile;

    With ServerD passed on the command line prints:

    Server: del2 ID: U: Space: 7973228544 Server: del3 ID: U: Space: 3973228544

    DWIM is Perl's answer to Gödel
Re: Load regex
by ikegami (Patriarch) on Feb 15, 2006 at 21:59 UTC
    # This could be loaded from a file, a db, whatever. $uncompiled_regexp = 'a.*b'; $text =~ /$uncompiled_regexp/; # If you plan on using the regexp many times, compile it! $compiled_regexp = qr/$uncompiled_regexp/; $text =~ $compiled_regexp;

    I like to omit the // for compiled regexp and leave them in for uncompiled regexps, but they are allowed and optional in both cases.

Re: Load regex
by diotalevi (Canon) on Feb 15, 2006 at 22:02 UTC

    I tried to imagine what you wanted to do and came up with several alternatives but couldn't guess what you really wanted. There's lots of things that are possible. Sure, you can store regular expressions in a database, fetch them, and then apply them to stuff. Now show what you'd like to be doing. Just applying a regex isn't very useful without something else to use the result of that.

    ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊