my $word = <theFile>
chomp($word); #`assuming word is by itself.
my $wordcount = 0;
foreach my $line (<theFile>) {
$line =~ s/$word/$wordcount++/eg;
}
print $wordcount."\n";
Найдите флаг регулярного выражения 'e', чтобы узнать, что это делает.Я не тестировал код, но что-то вроде этого должно работать.Для пояснения, флаг 'e' оценивает вторую часть регулярного выражения (подстановку) как код перед заменой, но это не так, поэтому с этим флагом вы сможете выполнить эту работу.
Теперьчто я понимаю, о чем вы просите, вышеуказанное решение не сработает.Что вы можете сделать, это использовать sysread, чтобы прочитать весь файл в буфер и запустить ту же самую подстановку после этого, но вам придется отключить первое слово вручную, или вы можете просто уменьшить значение после факта.Это потому, что файловый дескриптор sysread и обычный файловый дескриптор обрабатываются по-разному, поэтому попробуйте это:
my $word = <theFile>
chomp($word); #`assuming word is by itself.
my $wordcount = 0;
my $srline = '';
#some arbitrary very long length, longer than file
#Looping also possible.
sysread(theFile,$srline,10000000)
$srline =~ s/$word/$wordcount++/eg;
$wordcount--; # I think that the first word will still be in here, causing issues, you should test.
print $wordcount."\n";
Теперь, учитывая, что я прочитал ваш комментарий в ответ на ваш вопрос, я не думаю, что ваш текущий алгоритмоптимально, и вы, вероятно, хотите хэш, хранящий все значения слов в файле.Это, вероятно, лучше всего сделать, используя что-то вроде следующего:
my %counts = ();
foreach my $line (<theFile>) {
$line =~ s/(\w+)/$counts{$1}++/eg;
}
# now %counts contains key-value pair words for everything in the file.