in reply to How to remove duplicate key/value pairs in hash of array

Unique key/value pairs? Sounds like you need a hash. ;)
foreach $file (@list_of_files) { open FILE, "$dir/$file" || die "Can't open $dir/$file: $!\n"; while (defined($line = <FILE>)) { chomp $line; next if ($line =~ /unknown|shutdown/); ($name, $ranks, $serial_numbers) = split(' ',$line); $HoH{$name}{$ranks} = 1; } }
Think hash of hashes here, instead of hash of arrays.

Replies are listed 'Best First'.
Re: Re: How to remove duplicate key/value pairs in hash of array
by Tuna (Friar) on Feb 21, 2001 at 03:06 UTC
    Here's how I solved my problem:

    Beginning file:
    open (BEGIN_FILE, "$beg_file") || die "Cannot open: $!\n"; while ($line = <BEGIN_FILE>) { chomp $line; next if ($line =~ /unknown|shutdown|NONE/); ($as,$as_name,$nbr,$rtr,$int,$address,$int_name,$ifindex,$vpi,$vc +i) = split(' ',$priv_line); $begin{$int_name} = $rtr; }
    All the rest of the files:
    foreach $file(@end) { open FILE, "$file" || die "Cannot open: $!\n"; while ($line = <FILE>) { chomp $line; next if ($line =~ /unknown|shutdown|NONE/); ($as,$as_name,$nbr,$rtr,$int,$address,$int_name,$ifindex,$vpi, +$vci) = split(' ',$priv_line); $end{$int_name} = $rtr; } }
    Then, in order to end up with a hash of arrays, containing files that exist in my "non-beginning" files, but not in the beginning file:
    my %good_files = (); foreach $key (sort keys %end) { if (!exists($begin{$key})){ push (@{$good_files{$begin{$key}}}, ($key)); } }
    Works like a charm! Thanks to everyone for their help on this.
      You've got an array of items that you don't want to contain duplicates. If you store those items as the keys of a hash instead of as the elements of an array, then you will never have duplicates. That's one of the features of a hash.

      So, instead of a hash of arrays, my suggestion is that you use a hash of hashes. When you want to get the list of ranks for a specific name, you would do: my @ranks = keys %{$HoH{$name}};