Seeing as from your post you are open to learning some of the Perl specific syntactic magic that exists
After giving this some thought my primary suggestion would be to take advantage of perl hashes and do something like the following
Another suggestion would be to get familiar with
map which is a succinct way of writing a
foreach. What
map allows you to do is iterate over a list, be it an array, the keys of a hash, a range of numbers, letters, etc. and manipulate the contents element by element with a block of logic in a closure. In combination with
grep map comes in very handy for just this sort of thing.
use strict;
#Lets say we have two arrays @a and @b
#and we want to, as in your posting, remove the elements in @b
#from those in @a
my @a = (1..20);
my @b = (5,8,13,16);
#we in essence re-write the contents of @a with our map statement
#that allows us to check the values for those we want to remove.
@a = map{
my $i = $_;
(grep /^$i$/, @b) ? () : $i ;
}@a;
The above code feeds in the existing elements of
@a one at a time assigning each value to
$_ within the closure/block
{}, it then assigns this value to the locally scoped variable
$i for reasons that will make sense in a second.
grep is used to check for the value in our
@b array, however since grep can also have a closure and it also assigns its values to
$_ we check against
$i (told you it would make sense). The logic for the check is contained in a ternary
(if)?true:false; construct that returns either an empty list
(), in effect nothing, or the value of
$i if not found in
@b, all of which gets fed into the new version of
@a. The regexp anchors
^ and
$ are used to keep partial matches from messing with things, like '2' matching against '12,20...29,32,42,52,etc'.
Seems like I have written this before... maybe because I have.