perl hash loop: keys() vs values()

2013-06-15 Thread richard
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
--
tmqrich...@gmail.com


Re: perl hash loop: keys() vs values()

2013-06-15 Thread Octavian Rasnita
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 
  To: beginners@perl.org 
  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
  --
  tmqrich...@gmail.com

Re: perl hash loop: keys() vs values()

2013-06-15 Thread richard
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
--
tmqrich...@gmail.com


On Sat, Jun 15, 2013 at 2:19 PM, Octavian Rasnita orasn...@gmail.comwrote:

 **
 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 tmqrich...@gmail.com
 *To:* beginners@perl.org
 *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
 --
 tmqrich...@gmail.com




Re: perl hash loop: keys() vs values()

2013-06-15 Thread Peter Gordon
On Sat, 15 Jun 2013 12:12:56 -0400, richard wrote:
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?


Read http://www.tizag.com/perlT/perlhashes.php
particularly the section on sort by keys  by values.
This should give you a good understanding of the
how to use them.

--
Peter Gordon, pete...@netspace.net.au on 06/16/2013



--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/




Re: perl hash loop: keys() vs values()

2013-06-15 Thread richard
Thanks. I looked at this site while searching for solutions but I probably
skipped the section on sorting because I wasn't sorting the hash.

regards, Richard
--
tmqrich...@gmail.com


On Sun, Jun 16, 2013 at 3:17 AM, Peter Gordon pete...@netspace.net.auwrote:

 On Sat, 15 Jun 2013 12:12:56 -0400, richard wrote:
 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?
 
 
 Read http://www.tizag.com/perlT/perlhashes.php
 particularly the section on sort by keys  by values.
 This should give you a good understanding of the
 how to use them.

 --
 Peter Gordon, pete...@netspace.net.au on 06/16/2013



 --
 To unsubscribe, e-mail: beginners-unsubscr...@perl.org
 For additional commands, e-mail: beginners-h...@perl.org
 http://learn.perl.org/