Indeed there is. You can do away with the inner foreach loop (and a lot of regex recompiling) by constructing a regex and compiling it once. Change
towhile ($data = <DB>) { chomp($data); foreach $id (@id) { if ($data =~/$id/) { print OUT "$data\n"; } } }
The (?: ... ) surrounding the regex is to avoid setting $1 as a side effect. This saves a tiny bit of work.my $regex = '(?:' . join('|', @id) . ')'; while ( $data = <DB> ) { print OUT $data if $data =~ /$regex/o; }
The /o modifier on the regex invocation says to compile the regex once (a big win). Bye bye, inner loop.
Note that you also do away with the chomp(), since it doesn't affect the regex, and you'll need a newline on the end of the string anyway.
In reply to Re: need more efficient way to write this query script
by dws
in thread need more efficient way to write this query script
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |