>>>>> "Ing" == Ing Branislav Gerzo <[EMAIL PROTECTED]> writes:

Ing> Hi all,
Ing> let's we have:

Ing> use strict;
Ing> use warnings;

Ing> my @input = qw{ one two twentythree four };
Ing> my @filter = qw { one three five ten twenty };


Ing> my @filtered = ();
Ing> for my $in (@input) {
Ing>     for my $filter (@filter) {
Ing>         push @filtered, $in if $in =~ /$filter$/i;
Ing>     }
Ing> }

Ing> I'd like to get new @filtered array, where will be only values
Ing> from @input against @filter.

Ing> but my snippet is 6 lines, I think it should be written in 1 line, with
Ing> using grep and map, but I'm not sure how.

    ## first, precompile all the regex for speed:
    @filter = map qr/$_$/i, @filter;
    ## now grep the wanteds
    my @filtered = grep {
      my $wanted = 0;
      my $input = $_;
      $wanted ||= $input =~ /$_/ for @filter;
      $wanted;
    } @input;

Note the use of ||= for short-circuiting the tests once a good filter
is found.  You can't use "return 1", because a grep/map block is not a
subroutine.

-- 
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to