use strict; use warnings; open(my $f1, '<', $ARGV[0]) or die "Could not open '$ARGV[0]' for reading, stopped"; open(my $f2, '<', $ARGV[1]) or die "Could not open '$ARGV[1]' for reading, stopped"; my @arr1 = <$f1>; my @arr2 = <$f2>; close $f1 or die "Could not close '$ARGV[0]', stopped"; close $f2 or die "Could not close '$ARGV[1]', stopped"; my %hash; for my $element (@arr2) { push @{ $hash{$1} }, $2 if $element =~ m{ ^ \s* (rs\d+) \s+ \** (\w{2}) }x; } my $i = 0; for my $element (@arr1) { if (my ($rsid, $base1, $description) = $element =~ m{ ^ \s* (rs\d+) \s+ \** (\w{2}) \** \s+ (.*) $ }x) { if (exists $hash{$1}) { for my $base2 (@{ $hash{$1} }) { print "$rsid $base1 $base2 $description\n"; ++$i; } } } } print "Found $i matches\n";