Одно очевидное улучшение заключается в том, чтобы сначала открывать все файлы категорий в отдельном цикле и кэшировать слова в них в хэш массивов (ключ хеша - это имя файла) или в один большой массив, если вам все равно, какой поиск слово пришло из какого файла.
Это избавит вас от необходимости перечитывать файлы поиска для каждой строки в каждом $file
- И поможет избавиться от повторяющихся поисковых слов в сделке.
use File::Slurp;
open my $output, ">>D:/output.txt";
my %categories = ();
my @files = <"folder1/*">;
my @categories = <"folder2/*">;
foreach my $categoryName (@categories) {
my @lines = read_file($categoryName);
foreach my $category (@lines) {
chomp($category);
$categories{$category} = 0;
}
}
# add in some code to uniquify @categories
foreach my $file (@files) {
open my $fileh, $file || die "Can't open file $companyName";
foreach my $line (<$fileh>) {
foreach my $category (@categories) {
# count
}
}
# output
}
Кроме того, если это настоящие "слова", то есть категория "кошка" должна соответствовать "кошачьей собаке", а не "кошке", я бы посчитал использование слова, разделив вместо регулярного выражения:
foreach my $line (<$fileh>) {
my @words = split(/\s+/, $line);
foreach my $word (@words) {
$categories{$word}++ if exists $categories{$word};
}
}