in reply to Searching with grep
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;
|
|---|