my %data; open(DATA, '<<', 'test.csv') or die "Can't open file: $!"; while (my $row=) { @$_ = split /(?:,|\s)+/, $row; $#$_!=2 ? next : push @{$data{$_->[2]}}, @$_[1,0] }