use warnings; use strict; my ( $file1, $file2 ) = @ARGV; my $matched_word = {}; open my $fh, '<', $file1 or die "can't open file: $!"; while (<$fh>) { s/^\s+?|\s+?$//; if (m{(.+?)\s+?.+?=(.+?)\s+?.*?$}) { push @{ $matched_word->{$1} }, $2; } } close $fh or die "can't close file: $!"; open $fh, '<', $file2 or die "can't open file: $!"; while (<$fh>) { s/^\s+?|\s+?$//; my ( $value1, $value2 ) = split /\s+?\|\s+?/, $_; print $value1, " ", @{ $matched_word->{$value1} }, " ", $value2, $/ if exists $matched_word->{$value1}; } close $fh or die "can't close file: $!";