More Hash problems

Colin Kuskie ckuskie at dalsemi.com
Wed Jun 5 16:26:59 CDT 2002


On Wed, Jun 05, 2002 at 01:39:36PM -0700, Jason White wrote:
> I'm having some trouble with the contents of my hash changing.
> I start with a numerically keyed list of arrays.  The first element of each array is a name.
> The goal is to have one hash of rules indexable by integer keys and another indexable by name.
> 
> Here is my code:
1: my (%rules) = blah blah blah;  #Works and indexes fine
2: while(($key,$value)=each(%rules)){
3:     ($key,@{$value})=@{$value};
4:     $RULES{$key}=$value;
5: }

I think you're a victim of aliasing.  You see, here's what your code
really does:

1: Assign stuff to hash
2: take each key and a reference to the value from the hash
3: modify the actual contents of the hash value via the reference
   ($key, @{ $value }) = @{ $value };
4: create the new hash key/value pair.

There are several screwy things going on:

1) in the each, you never use the key!  Use values with a for loop instead.

foreach $v ( values(%hash) ) {

2) Don't recycle variables names carelessly.  If you'd used a
different variable name for the array for the 2nd hash, it would
work okay.

I tried this and it works:

my ($key, $v);
my %HASH;
my @arr;

foreach $v ( values(%hash) ) {
  @arr = @{ $v };
  $key = shift @arr;
  $HASH{$key} = \@arr;
}

Colin
TIMTOWTDI



More information about the Pdx-pm-list mailing list