my $csv = Text::CSV->new ({ binary => 1, # Allow utf8 and embedded newlines auto_diag => 1, # make detecting CSV errors easy }); # open into a lexical file handle open my $fh, "<", $file or die "$file: $!"; my @content; my %masterlist; $csv->getline ($fh); # skip first line # @hdr = @{$csv->getline ($fh)}; would save it for header info # $csv->getline () respects $/, but reads past embedded newlines while (my $row = $csv->getline ($fh)) { $masterlist{$row->[0]} = $row->[1]; # auto_diag takes care of the failures } close $fh;