Sagar Samtani
Sagar Samtani

Reputation: 203

Printing out associated key with values in Perl in foreach loop

I am trying to print out the key for the hash if the value satisfies a certain condition. However, I am not sure how to access the hash key if it satisfies the value condition. This is the code I have:

foreach my $x (values %hash){
    if ($x > $ARGV[1]){
        $counter = $counter + 1
        print "keys %hash\n"
    }
}
print "$counter\n" 

Upvotes: 2

Views: 321

Answers (2)

Borodin
Borodin

Reputation: 126742

You can't access the key of a hash element given its value. After all, multiple keys may have the same value. But you can rely on Perl giving you the keys in the same order as the values. So you could write something like this

use strict;
use warnings;

my @keys = keys %hash;
my @vals = values %hash;
my $count = 0;

for my $val ( @values ) {
    my $key = shift @keys;
    if ( $val > $ARGV[1] ) {
        ++$count;
        print $key, "\n";
    }
}

print "$count\n";

But it would be far better to use a while loop with each to gather both the key and the value at the same time

while ( my ($key, $val) = each %hash ) {
    if ( $val > $ARGV[1] ) {
        ++$count;
        print $key, "\n";
    }
}

Upvotes: 0

ysth
ysth

Reputation: 98398

When you loop over the values, you have no access to the key.

for my $key (keys %hash) {
    if ($hash{$key} > $ARGV[1]) {
        $counter = $counter + 1;
        print "$key\n";
    }
}
print "$counter\n";

or

keys %hash; # reset iterator
while (my ($key, $value) = each %hash) {
    if ($value > $ARGV[1]) {
        $counter = $counter + 1;
        print "$key\n";
    }
}
print "$counter\n";

Upvotes: 6

Related Questions