GetOptions( 'accept|a=s' => \my @accept, 'reject|r=s' => \my @reject, ) or die "Error with options\n"; my @filter = map eval "sub { \$_[0] =~ /$_/ }", @accept; push @filter, map eval "sub { \$_[0] !~ /$_/ }", @reject; # my @input = ([url, filename], ...); my @filtered = filter(@input); sub filter { return unless @filter; return map $_->[0], grep { my $f = $_; all { $_->($f->[1]) } @filter } @_; }