sub grep_in_place(&\@) { my ($cb, $array) = @_; my $src = -1; my $dst = -1; while (++$src < @$array) { my $keep; $keep = $cb->() for $array->[$src]; $array->[++$dst] = $array->[$src] if $keep; } $#$array = $dst; } grep_in_place { ... } @array;