use strict; use warnings; use Data::Dumper; use Text::CSV; use File::Basename; my @files = glob '*.csv'; my %hMFD; foreach my $file (@files){ my $file_base = fileparse($file, qr/\.csv/); my $csv = Text::CSV->new({sep_char => ';'}); open (CSV, "<", $file) or die $!; while () { if ($csv->parse($_)) { my @columns = $csv->fields(); $hMFD{$file_base}{$columns[0]} = $columns[1]; } else { my $err = $csv->error_input; print "Failed to parse line: $err"; } } close CSV; } print Dumper(\%hMFD); __END__ $VAR1 = { '1' => { 'Table' => 'M', 'Data' => 'O' }, '2' => { 'Table' => 'X', 'Data' => 'Y' } };