my @a = ( .. some extremely huge array .. ); my @want = ( .. some array of things I want to find ) my $index_a = make_indexfinder(\a); foreach ( @want ) { print $index_a->($want), "\n"; } sub make_indexfinder { my ($arrayref) = @_; my %value_table = (); my $last_index = 0; return sub { my ($quarry) = @_; exists $value_table{$quarry} and return $value_table{$quarry}; for ($last_index .. $#$arrayref) { ($quarry eq $arrayref->[$_]) and do { $last_index = $_; $value_table{ $quarry } = $_; return $_; }; $value_table{ $arrayref->[$_] } = $_; } return undef; }; }