#!/usr/bin/perl -- use strict; use warnings; use Data::Dump qw/ dd pp /; open my($fh),'<', \<<'__FUDGE__' or die; STORE PRODUCT_ID ==================== Sydney 12 Sydney 14 Canberra 12 Canberra 18 __FUDGE__ my %hash; $hash{(split)[0]}{(split)[1]} = 1 while <$fh>; seek $fh, 0, 0; dd\%hash; undef %hash; map { my @explicit = split ' ', $_; 2 == @explicit ## ==== and $hash{ $explicit[0] }{ $explicit[1] }++; (); } <$fh>; dd\%hash; __END__ $ perl fudge Use of uninitialized value in hash element at fudge line 16, <$fh> line 6. { "====================" => { "" => 1 }, "Canberra" => { 12 => 1, 18 => 1 }, "STORE" => { PRODUCT_ID => 1 }, "Sydney" => { 12 => 1, 14 => 1 }, } { Canberra => { 12 => 1, 18 => 1 }, STORE => { PRODUCT_ID => 1 }, Sydney => { 12 => 1, 14 => 1 }, }