#!/usr/bin/perl use warnings; use strict; use List::Util 'first'; use Benchmark qw(:hireswallclock cmpthese); sub grap (&@) { my ($sub,@list) = @_; foreach (@list) { return 1 if ($sub->($_)); } return; } my $count = 10000; our ($start, $end, $middle); $_ = [(0) x $count] foreach ($start, $end, $middle); $start->[0] = 1; $middle->[($count/2) -1] = 1; $end->[$count-1] = 1; foreach my $name (qw/start middle end/) { print uc "\n$name:\n"; cmpthese ( -1,{ 'grap' => 'my $result = grap { $_ } @$'.$name, 'grep' => 'my $result = grep { $_ } @$'.$name, 'first'=> 'my $result = first { $_ } @$'.$name, }) }