If you want to search two arrays and put the indices of the matching results from both into one array, you might need a way of keeping track of which array each stored index comes from (how do you know if this index corresponds to a match in @names, or in @desc, or in both?). Let's say you search @names first and @desc second, or you use OeufMayo's flattening approach: you might end up with the list (1,3,5,6,9,2,6,7). How do you know where the indices for @names leaves off and the indices of matching @desc entries begin? One answer is to return two lists (an array that consists of two anonymous arrays: the list of matches from @names, and the list of matches from @desc). Alternately, you could label which was which with a hash that consists of two anonymous arrays: so, with the above example, that hash would look like:
Either way, your search code wouldn't need to be modified much. Here's the hashy approach:%matches = ( name=>[1, 3,5,6,9], desc=>[2,6,7] );
my %matches; $matches{name} = [ grep { $names[$_] =~/$pattern/ } 0 ..$#names ]; $matches{desc} = [ grep { $desc[$_] =~/$pattern/} 0.. $#desc];
And of course you would return \%matches instead of \@matches.
But it might be even simpler than this: if, as I suspect from your desire to remove duplicates, both arrays are part of a larger data structure (such that for each name, there is a corresponding description) then you can stick with the current approach, slightly modified. Simply change that grep line to grab the matches from either array:
my @matches = grep { $names[$_] =~ /$pattern/ || $desc[$_] =~/$pattern/ } 0 .. $#names;
which will also solve the problem of weeding out the duplicates.
HTH.
Philosophy can be made out of anything. Or less -- Jerry A. Fodor
In reply to Re: Multi @array searches
by arturo
in thread Multi @array searches
by akm2
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |