in reply to better array plucking?

Splice is much more efficient, and the only reason it isn't working here is you're skipping the item after each item you remove. The following works fine:
my @c = (1..20); for ($i = 0; $i <= $#c; $i++) { if ($c[$i] >= 5 && $c[$i] <= 10) { splice(@c,$i,1); $i--; } } print join ' ', @c;
Outputs:
1 2 3 4 11 12 13 14 15 16 17 18 19 20
Or for your example:
my @c = ("bob", "bob", "martha", "bob"); for (my $i = 0; $i <= $#c; $i++) { if ($c[$i] eq "bob") { splice(@c,$i,1); $i--; } } print join ' ', @c;