my @extracted = extract { ... } @list; #### my @extracted; my $c = 0; while ($c < @$list) { local *_ = \$list->[$c]; if (do { ... }) { push @extracted, splice @$list, $c, 1; } else { $c++; } } #### my @extracted = grep { ... } @list; @list = grep { not ... } @list; #### my $filter = sub { ... }; my @extracted = grep { $filter->() } @list; @list = grep { not $filter->() } @list;