my %hash_one = ('string_one' => 0, 'string_two' => 0, 'string_three' => 0, 'string_four' => 0, 'string_five' => 0, 'string_six' => 0, 'string_seven' => 0); # first, create an array ref, element 0 is a qr// of the key, and element 1 is the count: for (keys %hash_one) { $hash_one{$_} = [qr/$_/, 0]; } # then walk the data, trying all the regexen: @ARGV = qw(file.txt); close ARGV; while (<>) { for (keys %hash_one) { $hash_one{$_}[1]++ if qr/$hash_one{$_}[0]/; } } # finally, replace the arrayref with just the count: $_ = $_->[1] for values %hash_one; # works in perl 5.5 and greater