#!/usr/bin/perl use warnings; use strict; use Data::Dumper; <>; # Skip the first line. my %hash; my ($cell, $cellr); while (my $header = <>) { if ($header =~ /\b/) { if ($header =~ /^CELL\s*$/) { $cell = <>; chomp $cell; next; } my @pos; my $flip; while ($header =~ /(\b|$)/g) { push @pos, $-[0] if ++$flip % 2; # Remember the position where a field starts. } chomp (my $value_line = <>); if (length $header <= length $value_line) { $pos[-1] = length $value_line; # Do not clip the value line if longer then header. } else { $value_line .= ' ' x (length($header)); # Do not die if the last fields are empty. } my @values; my @fields = split /\s+/, $header; for my $i (0 .. $#fields) { push @values, substr $value_line, $pos[$i], $pos[$i+1] - $pos[$i]; } s/^ +| +$//g for @values; if ($fields[0] eq 'CELLR') { $cellr = shift @values; shift @fields; } $hash{$cell}{$cellr}{$_} = shift @values for @fields; } } print Dumper \%hash;