use warnings; use strict; my $f1 = 'file1.txt'; my $f2 = 'file2.txt'; my @original; my @gottem; open( my $file1, '<', $f1 ); while ( my $line1 = (<$file1>) ) { next if ( $line1 =~ /^#/ ); chomp($line1); open( my $file2, '<', $f2 ); while ( my $line2 = (<$file2>) ) { next if ( $line2 =~ /^#/ ); chomp($line2); my ( $leftside, $rightside ) = split( /\s/, $line2, 2 ); if ( $line1 =~ $leftside ) { push( @original, $rightside ); } } } # print "$_\n" for(@original); for (@original) { open( my $file_2, '<', $f2 ); while ( my $line_2 = (<$file_2>) ) { my ( $first, $last ) = split( /\s/, $line_2, 2 ); if ( $last =~ $_ ) { push( @gottem, $line_2 ); } } } print $_ for (@gottem); #### 123 456 789 #### 123 string 1 111 string 1 script should skip this line 222 string 1 333 string 1 456 string 2 444 string 2 it should skip this line as well 555 string 2 666 string 2 789 string 3 777 string 3 also skipping this line too 888 string 3 999 string 3 #### 123 string 1 111 string 1 222 string 1 333 string 1 456 string 2 444 string 2 555 string 2 666 string 2 789 string 3 777 string 3 888 string 3 999 string 3