in reply to compound structure? 4way-hash

To be really generic, you'd need to add combinations algorithm to generate the 2 from n indices at the top, but 2 from 4 is easier to do by hand.

#! perl -w use strict; use Data::Dumper; # if the number of fields was to vary you could generate the combinati +ons using an algorithm. my @sets = ( [1,2,3], # 1st (index 0) field can be combined with these othe +r fields. [0,2,3], # 2nd with these... [0,1,3], [0,1,2] ); my %hash; my @labels = split/\s+/, <DATA>; # read the labels from the first l +ine of the DATA... while (<DATA>) { chomp; my @fields = split; for my $index (0 .. $#sets) { $hash{ $labels[$index] }{ $fields[$_] } = $fields[$index] for (@{$sets[$index]}[0 .. 2]); } } print Dumper(\%hash); __DATA__ mac ip name file ABCDEFABCDEF10 10.0.0.1 www.foo1.com afilename1 ABCDEFABCDEF02 10.0.0.2 www.foo2.com afilename2 ABCDEFABCDEF03 10.0.0.3 www.foo3.com afilename3 ABCDEFABCDEF04 10.0.0.4 www.foo4.com afilename4 ABCDEFABCDEF05 10.0.0.5 www.foo5.com afilename5

When run produces the following output.

$VAR1 = { 'ip' => { 'www.foo5.com' => '10.0.0.5', 'ABCDEFABCDEF02' => '10.0.0.2', 'ABCDEFABCDEF10' => '10.0.0.1', 'ABCDEFABCDEF03' => '10.0.0.3', 'www.foo2.com' => '10.0.0.2', 'ABCDEFABCDEF04' => '10.0.0.4', 'ABCDEFABCDEF05' => '10.0.0.5', 'afilename1' => '10.0.0.1', 'afilename2' => '10.0.0.2', 'afilename3' => '10.0.0.3', 'www.foo3.com' => '10.0.0.3', 'afilename4' => '10.0.0.4', 'afilename5' => '10.0.0.5', 'www.foo4.com' => '10.0.0.4', 'www.foo1.com' => '10.0.0.1' }, 'file' => { 'www.foo5.com' => 'afilename5', 'ABCDEFABCDEF02' => 'afilename2', 'ABCDEFABCDEF10' => 'afilename1', '10.0.0.5' => 'afilename5', 'ABCDEFABCDEF03' => 'afilename3', 'www.foo2.com' => 'afilename2', 'ABCDEFABCDEF04' => 'afilename4', 'ABCDEFABCDEF05' => 'afilename5', 'www.foo3.com' => 'afilename3', 'www.foo4.com' => 'afilename4', '10.0.0.1' => 'afilename1', 'www.foo1.com' => 'afilename1', '10.0.0.2' => 'afilename2', '10.0.0.3' => 'afilename3', '10.0.0.4' => 'afilename4' }, 'mac' => { 'www.foo5.com' => 'ABCDEFABCDEF05', '10.0.0.5' => 'ABCDEFABCDEF05', 'www.foo2.com' => 'ABCDEFABCDEF02', 'afilename1' => 'ABCDEFABCDEF10', 'afilename2' => 'ABCDEFABCDEF02', 'afilename3' => 'ABCDEFABCDEF03', 'www.foo3.com' => 'ABCDEFABCDEF03', 'afilename4' => 'ABCDEFABCDEF04', 'afilename5' => 'ABCDEFABCDEF05', 'www.foo4.com' => 'ABCDEFABCDEF04', '10.0.0.1' => 'ABCDEFABCDEF10', 'www.foo1.com' => 'ABCDEFABCDEF10', '10.0.0.2' => 'ABCDEFABCDEF02', '10.0.0.3' => 'ABCDEFABCDEF03', '10.0.0.4' => 'ABCDEFABCDEF04' }, 'name' => { 'ABCDEFABCDEF02' => 'www.foo2.com', 'ABCDEFABCDEF10' => 'www.foo1.com', '10.0.0.5' => 'www.foo5.com', 'ABCDEFABCDEF03' => 'www.foo3.com', 'ABCDEFABCDEF04' => 'www.foo4.com', 'ABCDEFABCDEF05' => 'www.foo5.com', 'afilename1' => 'www.foo1.com', 'afilename2' => 'www.foo2.com', 'afilename3' => 'www.foo3.com', 'afilename4' => 'www.foo4.com', 'afilename5' => 'www.foo5.com', '10.0.0.1' => 'www.foo1.com', '10.0.0.2' => 'www.foo2.com', '10.0.0.3' => 'www.foo3.com', '10.0.0.4' => 'www.foo4.com' } };

What's this about a "crooked mitre"? I'm good at woodwork!