use Data::Dumper; use strict; use warnings; my %hoa; my $fname; while (my $line = ) { chomp $line; if ($line =~ /^[a-z]/ ) { $fname = $line; } elsif ($line =~ /^[0-9]+,/) { push @{$hoa{$fname}}, $line; } } print Dumper(\%hoa); __DATA__ >data set dm01 >instances 0,-869,foofoofoofoofoofoofoofoo,28 0,-853,barbarbarbarbar,14 >data set yst02 >instances 0,-1566,quxquxquxqux,9 0,-1545,bembembem,9 0,-1394,birbirbirbir,9 >data set mus03 >instances 0,-1274,tingtingtingting,11 0,-1220,tongtongtong,11 0,-475,bubububu,11 0,-459,catcatcatcatcat,11