#! /usr/bin/perl use strict; use warnings; use Text::CSV_XS; my $csv = Text::CSV_XS->new({ binary => 1, allow_whitespace => 1, }) or die "Cannot use CSV: " . Text::CSV_XS->error_diag(); # for testing; in real world, open file and use that handle my $fh = \*DATA; my (%hash, @hdr); while ( my $row = $csv->getline( $fh ) ) { # header not yet defined? or 1st cell starts with '<' ==> use row as header if ( !@hdr || $row->[0] =~ m/^[$i] ? $row->[$i] : () ); } } } # check created data structure require Data::Dumper; $Data::Dumper::Sortkeys = 1; print Data::Dumper::Dumper( \%hash ); __DATA__ , , a1, aa1, aaa1 a2, , aaa2 a3, aa3 a4 , b1, bb1 b2, bb2 b3 #### $VAR1 = { '' => [ 'a1', 'a2', 'a3', 'a4' ], '' => [ 'aa1', 'aa3' ], '' => [ 'aaa1', 'aaa2' ], '' => [ 'b1', 'b2', 'b3' ], '' => [ 'bb1', 'bb2' ] };