Как использовать Regex в операторе while If? Perl - PullRequest
2 голосов
/ 23 января 2020

Я новичок в программировании и столкнулся с проблемой. Мы должны использовать Perl, чтобы написать скрипт, который открывает файл, затем перебирает каждую строку с помощью регулярных выражений, а затем распечатывает результаты. Открытие файла и l oop у меня есть, но я не могу понять, как реализовать Regex. Он выводит 0 совпавших результатов, когда схема назначения предлагает число 338. Если я не использую Regex, он выводит 2987, что является общим числом строк - что правильно. Так что с Regex что-то не так, я просто не могу понять. Любая помощь будет принята с благодарностью!

Вот что я имею до сих пор:

use warnings;
use strict;

my $i = 0;
my $filename = 'C:\Users\sample.log.txt';

open (fh, '<', $filename) or die $!;

while(<fh>) {
    if ($filename=~ /(sshd)/){
        $i++;
    }
}

close(fh);
print $i; 

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Рассмотрите этот фрагмент своего кода:

while(<fh>) {
    if ($filename=~ /(sshd)/){
        $i++;
    }
}

Вы действительно просматриваете строки файла, но продолжаете проверять, соответствует ли имя файла вашему регулярному выражению. Это явно не то, что вы намеревались.

Вы имели в виду:

while (my $line = <fh>) {
    if ($line =~ /sshd/){
        $i++;
    }
}

Круглые скобки вокруг регулярного выражения кажутся излишними (они - мясо для захвата, а вы только соответствуете).

Поскольку выражение while (<fh>) назначает содержимое строки специальной переменной $_ (которая является аргументом по умолчанию для сопоставления регулярному выражению), это можно сократить как:

while (<fh>) {
    $i++ if /sshd/;
}
0 голосов
/ 24 января 2020

В коде OP есть ошибки, которые я исправил

use warnings;
use strict;
use feature 'say';

my $i = 0;
my $filename = 'C:\Users\sample.log.txt';

open my $fh, '<', $filename
        or die "Couldn't open $filename";

map{ $i++ if /sshd/ } <$fh>;

close($fh);

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