# It's does something similar to this. sub elementer(&\@;$$) { my ($coderef,$arrayref,$start_index,$end_index) = @_; $start_index = 0 unless $start_index; $end_index = $#{$arrayref} unless $end_index; return sub { return if $start_index > $end_index; for (; $start_index <= $end_index;$start_index++){ $_ = $arrayref->[$start_index]; if (&$coderef){ $start_index++; return wantarray ? ($_ ,($start_index -1 ) ) : $_; } } } } my @nums = (1..1000); my $find = elementer { "$_" =~m/5$/ } @nums ; while (my $found = $find->() ) { # ... do something with each match print $found,"\n"; }