$ cat t.pl #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %CELLS; my $tmp; my $curCELL; my $curCELLR; while () { # skip blank lines next if /^\s*$/; # Line isn't empty, so current line is a list of field names # and the next line is a list of the values my @names = split /\s+/, $_; my @values = split /\s+/, ; $curCELL = $values[0] if $names[0] eq 'CELL'; $curCELLR = $values[0] if $names[0] eq 'CELLR'; # Store the name/value pairs (if we have both keys) next unless defined $curCELL and defined $curCELLR; @{$CELLS{$curCELL}{$curCELLR}}{@names} = @values; } print Dumper(\%CELLS); __DATA__ NEIGHBOUR RELATION DATA CELL LUC325C CELLR DIR CAND CS LUC325B MUTUAL BOTH NO KHYST KOFFSETP KOFFSETN LHYST LOFFSETP LOFFSETN 3 0 3 0 TRHYST TROFFSETP TROFFSETN AWOFFSET BQOFFSET 2 0 5 3 HIHYST LOHYST OFFSETP OFFSETN BQOFFSETAFR 5 3 0 3 CELLR DIR CAND CS LUC116A MUTUAL BOTH NO KHYST KOFFSETP KOFFSETN LHYST LOFFSETP LOFFSETN 3 0 3 0 TRHYST TROFFSETP TROFFSETN AWOFFSET BQOFFSET 2 0 5 3 HIHYST LOHYST OFFSETP OFFSETN BQOFFSETAFR 5 3 0 3 CELLR DIR CAND CS LUC204A MUTUAL BOTH NO KHYST KOFFSETP KOFFSETN LHYST LOFFSETP LOFFSETN 3 0 3 0 TRHYST TROFFSETP TROFFSETN AWOFFSET BQOFFSET 2 0 5 3 HIHYST LOHYST OFFSETP OFFSETN BQOFFSETAFR 5 3 0 3 CELL LUC082B