my %line; { open my $fhA, '<', 'A' or die $!; while (<$fhA>) { $line{$.} = undef if /$X/; } } #### use Fcntl qw/:flock/; { my @file; open my $fhB, '+<', 'B' or die $!; flock $fhB, LOCK_EX or die $!; while (<$fhB>) { s/$Y/$Z/ if exists $line{$.}; push @file, $_; } truncate $fhB, 0 or die $!; # set up to overwrite file print $fhB @file; } #### use Tie::File; tie my @file, 'Tie::File', 'B' or die $!; { open my $fhA, '<', 'A' or die $!; while (<$fhA>) { $file[$. - 1] =~ s/$Y/$Z/ if /$X/; } }