in reply to are they all there?

Since, as you say, your 'collections' are strings, you could consider something like the following:

my @required = qw ( apple banana orange pear ); my @collections = ( 'foo pear bar apple', 'apple foo pear orange banana', 'pineapple appearance', ); foreach my $collection ( @collections ) { foreach my $item ( @required ) { $collection .= " $item" unless $collection =~ /\b$item\b/; } } print "$_\n" for @collections;

Update: ikegami++ (see below). I haven't changed the code in this node, but please use the suggested improvement.

Replies are listed 'Best First'.
Re^2: are they all there?
by ikegami (Patriarch) on Aug 22, 2006 at 18:30 UTC

    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/; } }

      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/.