I have an array
my @array = qw/FOO BAR BAZ/;
and a scalar read from a file containing data like
That is exactly what grep is for. Here's a small snippet:
use strict;
use warnings;
my $str = "+++123++585+++FOO";
my $blank = "+++123++585+++XYZ";
my @array = qw/FOO BAR BAZ/;
print grep {$str =~ $_} @array, "\n";
print grep {$blank =~ $_} @array, "\n";
This would just return:
FOO
grep
, reduce
and map
are what we call higher order functions in FP world, though reduce
might be called fold
there. Have a look at MJD's Higher Order Perl for more of these.
Yes, there is far better way. You can construct regular expression. It will be alternatives of fixed strings which is fortunately translated into trie (Aho-Corasick) which leads into linear search time. It is the most efficient way at all.
my @array = qw/FOO BAR BAZ/;
my $re = join '|', map quotemeta, @array;
$re = qr/$re/;
for my $string (@strings) {
if ($string =~ $re) {
...
}
}
You can create a regex that matches all of the @array:
my $regex = join '|', map quotemeta, @array;
$string =~ $regex;