@b1
оценивается как true (это массив с ненулевым числом элементов), поэтому логический тест в вашей конструкции grep (not @b1
) всегда будет возвращать false.grep фильтрует массив, возвращая только те элементы, для которых логический тест возвращает значение true.
Вам необходимо проверить, находится ли $_
(рассматриваемый элемент массива) в @bl
или нет.Один из способов сделать это - сгенерировать временный хеш, используя @bl
в качестве ключей, а затем в своем выражении grep проверить наличие $_
в ключах хеша:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @bl = qw(red green blue);
my @a = qw(green yellow purple blue pink);
# create a hash
my %h;
# nifty trick - use a hash slice to populate the
# hash. The values are irrelevant so we'll use @bl
# for those too
@h{@bl} = @bl;
print Dumper [grep {!exists $h{$_}} @a];