@array = do { my $i; (grep $i || $_ ne $wanted || $i++, @array), $i ? $wanted : (); }; # or, as a sub: sub move { my ($wanted, $i)=shift; (grep $i || $_ ne $wanted || $i++, @_), $i ? $wanted : (); }