use strict; use warnings; use Benchmark qw( cmpthese ); use List::Util qw( first ); use List::MoreUtils qw( first_index ); my @short = qw( c a b c d b c d c ); my @med = map { chr(ord('a') + rand(26)) } 0..100; my @long = map { chr(ord('a') + rand(26)) } 0..1000; sub grep_alone { my ($item, @list) = @_; my $found = 0; @list = grep { $item ne $_ || $found++ } @list; return @list; } sub grep_splice { my ($item, @list) = @_; my ($index) = grep { $item eq $list[$_] } 0..$#list; splice(@list, $index, 1) if defined $index; return @list; } sub grep_splice_2 { my ($item, @list) = @_; my $found = 0; my ($index) = grep { $item eq $list[$_] && !($found++) } 0..$#list; splice(@list, $index, 1) if defined $index; return @list; } sub first_splice { my ($item, @list) = @_; my $index = first { $item eq $list[$_] } 0..$#list; splice(@list, $index, 1) if defined $index; return @list; } sub findex_splice { my ($item, @list) = @_; my $index = first_index { $item eq $_ } @list; splice(@list, $index, 1) if $index >= 0; return @list; } print("Verify:\n\n"); print('grep_alone: ', (grep_alone @short), "\n"); print('grep_splice: ', (grep_splice @short), "\n"); print('grep_splice_2: ', (grep_splice_2 @short), "\n"); print('first_splice: ', (first_splice @short), "\n"); print('findex_splice: ', (findex_splice @short), "\n"); print("\n\n"); print("\@short:\n\n"); cmpthese(-1, { grep_alone => sub { grep_alone @short; 1; }, grep_splice => sub { grep_splice @short; 1; }, grep_splice_2 => sub { grep_splice_2 @short; 1; }, first_splice => sub { first_splice @short; 1; }, findex_splice => sub { findex_splice @short; 1; }, }); print("\n\n"); print("\@med:\n\n"); cmpthese(-1, { grep_alone => sub { grep_alone @med; 1; }, grep_splice => sub { grep_splice @med; 1; }, grep_splice_2 => sub { grep_splice_2 @med; 1; }, first_splice => sub { first_splice @med; 1; }, findex_splice => sub { findex_splice @med; 1; }, }); print("\n\n"); print("\@long:\n\n"); cmpthese(-1, { grep_alone => sub { grep_alone @long; 1; }, grep_splice => sub { grep_splice @long; 1; }, grep_splice_2 => sub { grep_splice_2 @long; 1; }, first_splice => sub { first_splice @long; 1; }, findex_splice => sub { findex_splice @long; 1; }, }); print("\n\n"); print("The XS versions of List::Util and List::MoreUtils were used.\n");