Существует ряд проблем с вашим кодом, но причина неправильной печати номеров строк заключается в том, что вы увеличиваете переменную $counter
один раз каждый раз, когда в строке появляется Apples
, и сохраняете ее в @lineAry
,Это отличается от номера строки, в которой появляется строка, и самое простое решение - использовать встроенную переменную $.
, которая представляет число раз, когда чтение было выполнено для дескриптора файла
Кроме того, я бы посоветовал вам использовать лексические дескрипторы файлов и трехпараметрическую форму open
и проверять, чтобы каждый вызов open
был успешным
Никогда не используйте значение $initialLine
и я не понимаю, почему вы инициализировали его 10
Я бы написал так:
use strict;
use warnings 'all';
my $filename = 'file.txt';
open my $fh, '<', $filename or die qq{Unable to open "$filename" for input: $!};
my @lines;
my $n;
while ( <$fh> ) {
push @lines, $. if /apples/i;
++$n while /apples/ig;
}
print "Apples appear $n times in this file\n";
print "Apples appear on these lines: ", join( ', ', @lines ), "\n\n";
output
Apples appear 2 times in this file
Apples appear on these lines: 1, 4