my %search_cache; sub search_for { my $table = shift; my $value = shift; return $search_cache{$value} if exists $search_cache{$value}; foreach my $row (@{$table}) { if ($row->{column} eq $value) { return $search_cache{$value} = $row; } } return $search_cache{$value} = undef; # cache failure }