Thanks to all for your replies - they were all very helpful.
Things like this
@list = grep { $item ne $_ } @list;
aren't in the man-page, and got me thinking. This however:
my ($index) = grep { $item eq $list[$_] } 0..$#list;
splice(@list, $index, 1) if defined $index;
was a real satori, Keanu-Reeves-like "Whoah!!" moment for me. The idea of using grep on a list without naming _that_ list as the argument to grep would never have occurred to me. Guess I was stuck in Unix grep thinking!
Feeling quite humbled.