my $data={}; my $file; while(<>) { chomp; # Skip blank lines next if /^\s*$/; if (/^Header/) { $data->{$_}={}; # Create a new first-level hash. $file=$_; next; } if (/^([a-zA-Z0-9*/]{3}-\S{3})\s+/) { my $key=$1; if ($file) { # Check for duplicates. if (exists($data->{$file}->{$key})) { warn "Duplicate key $key in $file: $_\n"; next; } $data->{$file}->{$key}=$_; } else { warn "Line found before a header line: $_\n"; } } else { # Reject improper lines warn "Badly formatted line found, ignoring: $_\n"; } }