A,B*,item2,, A,B*item1,,, A,B*,,,item4 C,D*item1,,, C,D*,,item3, #### sub merge { open(INFILE, "test.put"); my %data; while () { chomp; my ($key,@items) = split(/\*/); $data{$key}{$_}++ for @items; } close INFILE; print Dumper(\%data); } #### $VAR1 = { 'C,D' => { ',,item3,' => 1, 'item1,,,' => 1 }, 'A,B' => { ',,,item4' => 1, ',item2,,' => 1, 'item1,,,' => 1 } }; #### C,D,item1,,item3, A,B,item1,item2,,item4