in reply to Organising lots of simple regexes

Put your rules in a hash, which stores an arrayref with the first element as the host and the second as the path:

my %REDIRECTS = ( 'www.theirsite.com' => [qw( our.server1 theirsite/ )], 'www.dummy.com' => [qw( our.server2 dummy/)], # And so on );

Use URI.pm to parse your input and get the host:

use URI; my $uri = URI->new($_); my $host = lc $uri->host; # Need to make sure the case is correct

And then simply pull the redirect out of the hash and do what your load of s/// functions are doing now:

$_ = join '/', @{ $REDIRECT{$host} };

If you want to have some action happen for each host, you can put a subroutine ref as the third element of the arrayref (you'll need to add an array slice to the last line of code above).

----
I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
-- Schemer

: () { :|:& };:

Note: All code is untested, unless otherwise stated

Replies are listed 'Best First'.
Re: Re: Organising lots of simple regexes
by ViceRaid (Chaplain) on Jan 27, 2004 at 16:05 UTC

    Thanks all for your ideas. As an alternate way of writing this, so I don't have to have lots of subroutine refs in a big hash structure, I'm now thinking of doing something like this:</code>

    use strict; package Our::Redirects; sub www_theirsite_com { my $url = shift; # and transform url here however } # allow for alt domain names *www_theirsite_co_uk = \&www_theirsite_com; package main; use URI; while ( <> ) { my $uri = URI->new($_) or die "Can't parse URI"; my $func = lc( $uri->host() ); $func =~ tr/.-/_/; if ( defined &{ "Our::Redirects::$func" } ) { &{ \&{ "Our::Redirects::$func" } }($_); } }

    This seems to me to have the advantages of a hash-type construct - i.e. straight-thru mapping - but slightly sugary syntax, particularly for some of the cases which aren't quite as simple as the ones I suggested. Does this seem like a reasonable way to go?

    Thanks again

      That's reasonable. I would change the code to call the subroutine as Our::Redirects->$func (the subroutines would have to be changed to something like sub www_theirsite_com { my ($class, $url) = @_; . . . }. Also, I would pass the URI object instead of its string form. Lastly, wrap the call in an eval to get rid of the conditional (such as eval { Our::Redirects->$func($uri) };).

      ----
      I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
      -- Schemer

      : () { :|:& };:

      Note: All code is untested, unless otherwise stated