#! perl -w use strict; use Data::Dumper; # if the number of fields was to vary you could generate the combinations using an algorithm. my @sets = ( [1,2,3], # 1st (index 0) field can be combined with these other fields. [0,2,3], # 2nd with these... [0,1,3], [0,1,2] ); my %hash; my @labels = split/\s+/, ; # read the labels from the first line of the DATA... while () { 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 #### $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' } };