in reply to Searching with grep

You say: "to avoid using a loop in the code". You should understand there IS a loop here although disguised. It is a mistake to equate number of source code lines with performance. Sometimes more lines are "faster". In this case the grep will loop through all of the lines and report its result at the end.

If performance is a concern and the hash is "large", some more wordy code could wind up being significantly faster on average because it can "give up" when a match is found.

Update: oh, another point... $_->{date} =~ /^$search$/ That says that the date must exactly match the search, from beginning to end. Using "eq" is faster because it doesn't involve the regex engine. "eq" is a stupid, but a very fast critter. It will also "give up" at the first character position that mismatches.

#!/usr/bin/perl use strict; use warnings; my $data = [ { 'date' => '20160101', 'day' => 'Friday' }, { 'date' => '20160215', 'day' => 'Monday' }, { 'date' => '20160530', 'day' => 'Monday' }, { 'date' => '20160704', 'day' => 'MOnday' }, { 'date' => '20160905', 'day' => 'Monday' }, { 'date' => '20161010', 'day' => 'Monday' }, { 'date' => '20161124', 'day' => 'Thursday' }, { 'date' => '20161125', 'day' => 'Friday' }, { 'date' => '20161226', 'day' => 'Monday' }, { 'date' => '20170102', 'day' => 'Monday' } ]; my $search = "20161010"; #[choroba] solution....and a good one! #my $result = ( grep $_->{date} =~ /^$search$/, @$data ) ? 'Found' : ' +Not Found'; #Another way as a demo using "last" my $found; foreach my $ref (@$data) { if ($ref->{date} eq $search) { $found++; print "Found $search\n"; last; ## stops the foreach loop after "found" } } print "Not Found: $search \n" if !$found;