sub dgrep (&+) { my $code = shift; my $array = shift; my @return; for my $i ( -$#$array .. 0 ){ local $_ = $array->[-$i]; if(&$code){ unshift @return, $array->[-$i]; splice @$array, -$i, 1; } } @return; } my @array = qw(moon fruit address buddy geese join say gone); my @goners = dgrep { /(.)\1/ } @array; warn "goners: (@goners)\n"; warn "array: (@array)\n"; __END__ goners: (moon address buddy geese) array: (fruit join say gone)