in reply to grepping arrays

What you're missing is that the first parameter to grep is supposed to be an expression or a block of code, whose return value determines success or failure of each match. In your case, that return value is found by evaluating $username, which is most likely a true value. So then the grep gives you every single element from @ignore because the expression was true for every one of them. What you really meant to do is either a straight comparison:
grep $username eq $_, @ignore
or a pattern match:
grep /$username/, @ignore
Note that the second is still an expression, and gets evaluated with each element in @ignore aliased to $_ in turn. You can just write it in this short form because by default, matches are attempted against $_ unless otherwise specified. So the second form is exactly equivalent to this:
grep $_ =~ /$username/, @ignore

Makeshifts last the longest.