in reply to Re: Multiple identical keys in a hash.
in thread Multiple identical keys in a hash.

My data is similar to:

File 1

dn=machinename
config=2000
speed=19200
setting=value1
setting=value2
setting=value3

File 2

dn=machinename2
config=2020
speed=9600
setting=value1
setting=value2
setting=value3


I need for all occurances of setting to end up in the hash for file one, and then compare the contents of file two and output the differences.
  • Comment on RE: Re: Multiple identical keys in a hash.

Replies are listed 'Best First'.
RE: RE: Re: Multiple identical keys in a hash.
by ZZamboni (Curate) on Apr 24, 2000 at 18:13 UTC
    You could put all the values in array references indexed by your two-level hash. Something like this:
    foreach $f (@files) { open FILE, $f or die "Error: $!"; while(<FILE>) { chomp; my ($k,$v)=split("=",$_,2); # Assume dn= comes before other lines $level1=$k, next if $k eq "dn"; unless ($level1) { die "Need to get dn= line first\n"; } push @{$hash{$level1}{$k}}, $v; } close FILE; }
    Then you will have something like this:
    $hash{machinename}{config}=["2000"] $hash{machinename}{speed}=["19200"] $hash{machinename}{setting}=["value1", "value2", "value3"] $hash{machinename2}{config}=["2020"] etc.
    And then do comparisons or anything else you need. See chapter 4 of The Perl Cookbook for examples of how to do fancy array operations, including comparisons.
RE: RE: Re: Multiple identical keys in a hash.
by BBQ (Curate) on Apr 24, 2000 at 20:13 UTC
    If the machines have different names (assuming a normal network :o)), don't you just need to do this? (continued from ZZamboni's code)
    foreach $f (@files) { open FILE, $f or die "Error: $!"; while(<FILE>) { chomp; my ($k,$v)=split("=",$_,2); # Assume dn= comes before other lines if ($k eq "dn") { push(@machines,$k); $machine = $k; } else { push(@{$machine}{$k},$v); } } close FILE; }
    In this case you would end up with almost the same effect:
    @machines = ('machinename','machinename2'); ${'machinename'}{'config'} = 2000; ${'machinename'}{'speed'} = 19600; ${'machinename'}{'setting'} = value1, value2, value3; ${'machinename2'}{'config'} = 2020; ${'machinename2'}{'speed'} = 19600; ${'machinename2'}{'setting'} = value1, value2, value3; etc...
    Points being:
    1. do you have to name a hash?
    2. is it better to have @machines?

    I'm starting to wonder about this too...