use 5.010; use strict; sub read_hash { my $data = shift; open my $fh, '<', \$data; my %hash; while (<$fh>) { chomp; my ($key,$value)=split /,/, $_, 2; $hash{$key}=$value; } return \%hash; } my $h1 = read_hash(<<'DATA'); k_a1,val_a1,val_a2,val_a3 k_a2,val_a4,val_a5 DATA my $h2 = read_hash(<<'DATA'); k_b1,val_a1 k_b2,val_a2 k_b3,val_a3 k_b4,val_a4 k_b5,val_a5 DATA my %tmp; while (my ($k, $v) = each $h1) { push @{ $tmp{$_} }, $k for split /,/, $v } while (my ($k, $v) = each $h2) { push @{ $tmp{$_} }, $k for split /,/, $v } for (values %tmp) { next if @$_ < 2; say join ',', @$_ }