Выведите номера строк, где появляется строка - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь определить, сколько раз строка, Apples появляется в текстовом файле и в каких строках она появляется.

Скрипт выводит неправильные номера строк, вместо этого он последовательно выводит номера (1,2, ..), а не правильные строки для слова.

file.txt

    Apples
    Grapes
    Oranges
    Apples

Результат на выходе

Apples appear 2 times in this file
Apples appear on these lines: 1, 4,

Вместо этого мой вывод, как показано в приведенном ниже коде:

Apples appear 2 times in this file
Apples appear on these lines: 1, 2,

Perl

my $filename = "<file.txt";

open( TEXT, $filename );

$initialLine = 10;    ## holds the number of the line
$line        = 0;
$counter     = 0;

# holder for line numbers
@lineAry = ();

while ( $line = <TEXT> ) {

    chomp( $line );

    if ( $line =~ /Apples/ ) {

        while ( $line =~ /Apples/ig ) {
            $counter++;
        }

        push( @lineAry, $counter );

        $initialLine++;
    }
}
close( TEXT );

# print "\n\n'Apples' occurs $counter times in file.\n";
print "Apples appear $counter times in this file\n";
print "Apples appear on these lines: ";

foreach $a ( @lineAry ) {
    print "$a, ";
}

print "\n\n";

exit;

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Существует ряд проблем с вашим кодом, но причина неправильной печати номеров строк заключается в том, что вы увеличиваете переменную $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
0 голосов
/ 13 сентября 2018

Изменение

push(@lineAry, $counter);

до

push(@lineAry, $.);

$. - это переменная, которая хранит номер строки при использовании perl's while (<>).

Альтернативой, если вы хотите использовать переменную $ counter, является то, что вы перемещаете приращение в приращение в каждой строке, а не в каждом совпадении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...