SPUG: Optimizing replace code

Chris Sutton chris at smalldognet.com
Fri Jan 21 13:58:57 CST 2000


Oh, I like that.

Actually, after I got the eval working it seemed to run slower than my
original regex.  I didn't think to try a whole different approach.

Thanks.

Chris

Riley wrote:
> 
> On second thought, if you really want to light a fire under your script,
> skip out on the regexes altogether and try something like this:
> 
>  sub hash_interpol { # hide yer stash!
>    my $hash = shift;
>    my $string = shift;
>    my ($endpos, $index);
>    while (($index = index($$string,'{',$index)) > 0) {
>      $endpos = index($$string,'}',$index);
>      substr($$string,$index,($endpos-$index)+1) =
>        $hash->{substr($$string,$index+1,($endpos-$index)-1)};
>    }
>  }
> 
> This runs about twice as fast as the original code, and 4-5 times as
> fast as the eval'd version on my machine.
> 
> --Riley
> ----------------------
> CARTHAGO DELENDA EST.
> 
> On Fri, 21 Jan 2000, Riley wrote:
> 
> >
> > I think the problem may be that you're using the eval {} form rather than
> > eval "" so that $evalcode is not run-time interpolated before evaluation
> > -- it's just returned as a scalar value.
> >
> > You're getting great efficiency but not compiling any regexes at all!
> >
> >
> > --Riley
> > ----------------------
> > CARTHAGO DELENDA EST.
> >
> > On Thu, 20 Jan 2000, Chris Sutton wrote:
> >
> > > Hello,
> > >
> > > I have a general purpose function that takes a string like this
> > >
> > > This {is} a {test}
> > >
> > > and a hash like this
> > >
> > > is => "IS",
> > > test => "TEST"
> > >
> > > and spits out
> > >
> > > This IS a TEST
> > >
> > > Here is my original code
> > >
> > > my $hash = shift;   #pointer to hash
> > > my $string = shift; #pointer to string
> > > my $key;
> > >
> > > foreach $key (keys %$hash) {
> > >     $$string =~ s/\{$key\}/$$hash{$key}/g;
> > > }
> > >
> > > After going to the December SPUG meeting and learning a bit more about
> > > the different efficiencies of regular expressions, it dawned on me that
> > > this is pretty slow and doing it the eval way would be much better.
> > > (Some testing and benchmarking proved eval to be about 4 times faster).
> > >
> > > So, here is my new code
> > >
> > > my $hash = shift;   #pointer to hash
> > > my $string = shift; #pointer to string
> > > my $key;
> > >
> > > my $evalcode;
> > >
> > > foreach $key (keys %$hash) {
> > >     $evalcode .= "\$\$string =~ s/\\{$key\\}/$$hash{$key}/g;";
> > > }
> > >
> > > eval { $evalcode };
> > >
> > > But for some reason it's not working the way it should and I think it
> > > has something to do with the $string pointer but I don't know how it's
> > > acting inside the eval.
> > >
> > > Any pointers? I'm off by a backslash somewhere right?

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    POST TO: spug-list at pm.org        PROBLEMS: owner-spug-list at pm.org
 Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
 SUBSCRIBE/UNSUBSCRIBE: Replace ACTION below by subscribe or unsubscribe
        Email to majordomo at pm.org: ACTION spug-list your_address





More information about the spug-list mailing list