in reply to Re: are they all there?
in thread are they all there?

Nice, but instead of compiling {number of collections} * {number of required items} regexps, swap your loops to only compile {number of required items} regexps.

foreach my $item ( @required ) { foreach my $collection ( @collections ) { $collection .= " $item" unless $collection =~ /\b$item\b/; } }

Replies are listed 'Best First'.
Re^3: are they all there?
by ikegami (Patriarch) on Aug 23, 2006 at 19:24 UTC

    I was asked

    How do we know that perl is smart enough not to recompile the regexp with every iteration of the inner loop nonetheless?

    We can use use re 'debug'; to see the difference.

    use re 'debug'; for my $i (1..2) { for my $re (qw( abc def )) { $i =~ /$re/; } }

    ouputs

    Compiling REx `abc' <------------ size 3 first at 1 1: EXACT <abc>(3) 3: END(0) anchored `abc' at 0 (checking anchored isall) minlen 3 Freeing REx: `abc' Compiling REx `def' <------------ size 3 first at 1 1: EXACT <def>(3) 3: END(0) anchored `def' at 0 (checking anchored isall) minlen 3 Freeing REx: `def' Compiling REx `abc' <------------ size 3 first at 1 1: EXACT <abc>(3) 3: END(0) anchored `abc' at 0 (checking anchored isall) minlen 3 Freeing REx: `abc' Compiling REx `def' <------------ size 3 first at 1 1: EXACT <def>(3) 3: END(0) anchored `def' at 0 (checking anchored isall) minlen 3 Freeing REx: `def'

    while

    use re 'debug'; for my $re (qw( abc def )) { for my $i (1..2) { $i =~ /$re/; } }

    outputs

    Compiling REx `abc' <------------ size 3 first at 1 1: EXACT <abc>(3) 3: END(0) anchored `abc' at 0 (checking anchored isall) minlen 3 Freeing REx: `abc' Compiling REx `def' <------------ size 3 first at 1 1: EXACT <def>(3) 3: END(0) anchored `def' at 0 (checking anchored isall) minlen 3 Freeing REx: `def'

    If the interpolated variables are still the same as they were the last time the regexp was compiled, the regexp is not recompiled.

    Update: We get the same results with /\b$re\b/.