use Data::Dumper; my (@data, @col_names, %tmp, $record); @data = ; chomp @data; @col_names = split ',', shift @data; while(my $line = shift @data) { last unless $line; @tmp{@col_names} = split ',', $line; print 'Inside ', Dumper \%tmp; push @{$record}, \%tmp; } push @{$record}, { 'what ', 'the £$%^& ?' }; print 'Outside ', Dumper $record; print 'Record 0 ', %{$record->[0]}, "\n"; print 'Record 1 ', %{$record->[1]}, "\n"; print 'Record 2 ', %{$record->[2]}, "\n"; print 'Record 3 ', %{$record->[3]}, "\n"; __DATA__ foo,bar 333,aaa 444,bbb 555,ccc __END__ Inside $VAR1 = { 'foo' => '333', 'bar' => 'aaa' }; Inside $VAR1 = { 'foo' => '444', 'bar' => 'bbb' }; Inside $VAR1 = { 'foo' => '555', 'bar' => 'ccc' }; Outside $VAR1 = [ { 'foo' => '555', 'bar' => 'ccc' }, $VAR1->[0], $VAR1->[0], { 'what ' => 'the £$%^& ?' } ]; Record 0 foo555barccc Record 1 foo555barccc Record 2 foo555barccc Record 3 what the £$%^& ?