use warnings; use strict; my %data; ; # Discard header while () { chomp; my ($tick, @cols) = split /\s*\|\s*/; my %comp; @comp{qw(name price cap ind)} = @cols; $data{$tick} = { %comp }; } use Data::Dumper; $Data::Dumper::Sortkeys=1; print Dumper(\%data); __DATA__ TICKER| CO. NAME| PRICE| MARKET CAP| INDUSTRY ABC | ABC Co.| 15.5| 5000| Industrials AB | Alpha Beta| 12| 2500| Materials DOZ | ZZZZZ| 5.05| 2800| Telecom DX | DX Co.| 77.2| 12000| Industrials DXX | DXX Co.| 50.25| 9000| Utilities