[Pdx-pm] string comparison vs hash

Eric Wilhelm scratchcomputing at gmail.com
Tue May 29 15:41:08 PDT 2007


# from Thomas J Keller
# on Tuesday 29 May 2007 01:52 pm:

>         my $names_join = join '|', @names;
>         my @goi;
>         if ($fh1->open("< $annot_file")) {
>             my @lines = <$fh1>;
>             foreach (@lines) {
>                 chomp;
>                push @goi, $_ if $_ =~ m/($names_join)/;

Hashes rock, but this regexp juggling might not be quite fair.  A more 
apt comparison would be either:

  1.  split the input and grep({$_ eq $name} @names)
or
  2.  $names_join = join("|", map({'\Q' . $_ . '\E'} @names));
      $names_join = qr/$names_join/;

(Untested, and there might be a tidier way to express that, see perlre.)

With your current code having $names_join as a string, the regular 
expression is being computed each time inside the foreach.  There 
should be a similar thread in the archive where Randall Hansen was 
working on a grep benchmark "oh, gross grep() re-evaluates the regex."

--Eric
-- 
[...proprietary software is better than gpl because...] "There is value
in having somebody you can write checks to, and they fix bugs."
--Mike McNamara (president of a commercial software company)
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------


More information about the Pdx-pm-list mailing list