Octavian Thanks for taking the time to write such a thorough reply. My question is completely answered by this section:
You can't get the key for a certain value. Say you have the following hash: my %hash = (a => 1, b => 2, c => 3, d => 2, e => 2); What's the key for the value "2"? I was so preoccupied with values() and keys(), thinking of them as being mirror-images of one another, that I forgot what a 'value' and a 'key' were. Thanks again regards, Richard -- [email protected] On Sat, Jun 15, 2013 at 2:19 PM, Octavian Rasnita <[email protected]>wrote: > ** > Perl has 2 types of arrays: common arrays and associative arrays which are > called hashes. > > In order to get the value of an item from an ordinary array, you need to > specify the index of that array, for example: > > my @array = (1, 2, 3); > print $array[1]; #will print "2" (because the indexes start from 0 > > A hash associates a key to any value and if you want to get the value, you > need to specify its key: > my %hash = (a => 1, b => 2, c => 3); > print $hash{b}; #will print "2" > > You can't get the key for a certain value. Say you have the following hash: > > my %hash = (a => 1, b => 2, c => 3, d => 2, e => 2); > > What's the key for the value "2"? > > The keys in a hash are always unique but the values can have duplicates. > > If you reverse the hash, the keys become values and the values become > keys, so you will be able to use the value as a key. But if the values > have duplicates, your reversed hash will contain less elements because that > hash will contain unique keys. > > In the example above, there would be just a single "2" key and not 3. > > So, the question is why do you need to access the keys using their values? > > Maybe you want to use an array of arrays like: > > my @array = ( > ['a', 1], > ['b', 2], > ['c', '3], > ['d', 2], > ); > > To get the "value" for the element with the index 1 you need to do: > > my $value = $array[1][1]; #the value "2" > > and to get the "key" for the element with the index 1, you can do: > > my $key = $array[1][0]; #Will get "b" > > I don't know what you need to do... that's why I gave the idea of using > arrays of arrays... > > --Octavian > > ----- Original Message ----- > *From:* richard <[email protected]> > *To:* [email protected] > *Sent:* Saturday, June 15, 2013 7:12 PM > *Subject:* perl hash loop: keys() vs values() > > Hi > > I'm trying to understand the difference between the keys() and values () > operators. What I'm not getting is why a hash must be reversed to get the > key corresponding to a value? (as stated in perldoc). Can someone explain > this please? > > Here is my test script; My perl is freebsd 5.8.9 > > use warnings; > use strict; > > my %hds = ('1', '0C8CB35F', '2', '0C9CB37D'); > print "rows: " . scalar keys(%hds) . "\n\n"; > > my $value; > my $key; > > foreach $value (values %hds) { > print "key: $hds{$value} \n"; > print "value: $value \n"; > } > > print "--------------------------- \n"; > > my %r_hds = reverse %hds; > foreach $value (values %hds) { > print "key: $r_hds{$value} \n"; > print "value: $value \n"; > } > > print "--------------------------- \n"; > > foreach $key (keys %hds) { > print "key: $key \n"; > print "value: $hds{$key} \n"; > } > > > Here is the output: > > Use of uninitialized value in concatenation (.) or string at h line 11. > key: > value: 0C8CB35F > Use of uninitialized value in concatenation (.) or string at h line 11. > key: > value: 0C9CB37D > --------------------------- > key: 1 > value: 0C8CB35F > key: 2 > value: 0C9CB37D > --------------------------- > key: 1 > value: 0C8CB35F > key: 2 > value: 0C9CB37D > > > -- > regards, Richard > -- > [email protected] > >
