В вашем коде есть пара синтаксических ошибок, которые приводят к неожиданным результатам.
Во-первых, если вам нужен пустой массив, вам нужно написать:
# Correct (creates an empty array)
my @array = ();
# Incorrect (creates a one-element array containing a reference to an empty array)
my @array = [];
# Incorrect (creates a one-element array containing the undef element)
my @array = undef;
Вам также необходимо изменить условие grep - регулярное выражение должно быть справа от оператора =~
:
perl -e '@arr = (); print "HELLO." unless grep { $_ =~ /asdf/} @arr;'
Если вы сделаете эти два изменения, код будет делать то, что вы ожидаете.