Если файлы достаточно малы, чтобы поместиться в памяти, вы можете подумать о сохранении строк в хэше, что исключит необходимость поиска O(n^2)
.
В рамках существующего подходасоветую не вкладывать циклы чтения вашего файла - возможно, из эстетических соображений, если ничего больше.Вместо этого поместите внутренний цикл в подпрограмму.
use strict;
use warnings;
# Works for 2 or more files.
analyze_files(@ARGV);
sub analyze_files {
my @file_names = @_;
my @handles = map { open my $h, '<', $_; $h } @_;
my $fh = shift @handles;
while (my $line = <$fh>) {
my @line_numbers = map { find_in_file($_, $line) } @handles;
print join("\t", @line_numbers, $line);
}
}
# Takes a file handle and a line to hunt for.
# Returns line number if the line is found.
sub find_in_file {
my ($fh, $find_this) = @_;
seek $fh, 0, 0;
while (my $line = <$fh>){
return $. if $line eq $find_this;
}
return -1; # Not found.
}