perl соответствует полной строке - PullRequest
0 голосов
/ 18 марта 2020

Я очень новичок в Perl. Попытка grep полной строки для согласованного шаблона строки. Похоже, он не может искать полную строку. Любое предложение?

use strict;
use warnings;
my $prev;
#my $pattern = ":E: (Sub level extra file/dir checks):";
open(INPUTFILE, "<log_be_sum2.txt") or die "$!";
open(OUTPUTFILE, ">>extract.txt") or die "$!";
while (<INPUTFILE>){
    if ($_ =~ /^:E: (Sub level extra file/dir checks):/){
        print OUTPUTFILE $prev, $_;
    }
    $prev = $_;
}

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Если вы хотите совпасть с литералом / в регулярном выражении, его нужно либо экранировать обратным символом sh, либо вам нужно использовать другой символ в качестве символа кавычки регулярного выражения (! в пример ниже). Скобки также необходимо экранировать, чтобы они не рассматривались как группа захвата:

use strict;
use warnings;
my $prev;
#my $pattern = ":E: (Sub level extra file/dir checks):";
open(INPUTFILE, "<", "log_be_sum2.txt") or die "$!";
open(OUTPUTFILE, ">>", "extract.txt") or die "$!";
while (<INPUTFILE>){
    if ($_ =~ m!^:E: \(Sub level extra file/dir checks\):!){
        print OUTPUTFILE $prev, $_;
    }
    $prev = $_;
}

Обратите внимание на изменение версии open с тремя аргументами, что настоятельно рекомендуется. Можно рассмотреть и лексические дескрипторы файлов. И хорошо для вас, чтобы использовать предупреждения и строгий режим! Не вижу этого достаточно у новых пользователей языка.

1 голос
/ 18 марта 2020

Хорошо, что вы используете strict и warnings, но вам следует обратить внимание на сообщения об ошибках / предупреждениях и опубликовать их вместе с вопросом, если вы их не понимаете. Моя версия Perl завершается с ошибкой о непревзойденном (. Причина, по которой выдается эта конкретная ошибка, заключается в том, что Perl считает, что ваше регулярное выражение завершено, когда оно видит "/" в "file / dir".

Если у вас есть специальные символы, рекомендуется использовать quotemeta . Я заметил, что у вас есть закомментированная строка с присвоением переменной pattern. Вы можете раскомментировать это и использовать это так:

...
my $pattern = quotemeta ":E: (Sub level extra file/dir checks):";
...
    if ($_ =~ /^$pattern/){
        ...
    }
    ...
}

Но есть также ярлык , задокументированный в perlre : escape-последовательности \Q и \E. Вы можете использовать его как $_ =~ /^\Q$pattern\E/. Вы по-прежнему можете использовать его и избежать присвоения переменной, но в вашем случае вам понадобится использовать другой символ для оператора, подобного кавычке, поскольку ваш шаблон содержит литерал /. Я предпочитаю m{}, но это действительно зависит от вас, если это не /.

use strict;
use warnings;
my $prev = q{}; # NOTE: see NOTE below 

open INPUTFILE, "<", "log_be_sum2.txt" or die "$!";
open OUTPUTFILE, ">>", "extract.txt" or die "$!";
while (<INPUTFILE>){
    if ($_ =~ m{^\Q:E: \(Sub level extra file/dir checks\):\E}){
        print OUTPUTFILE $prev, $_;
    }
    $prev = $_;
}

* ПРИМЕЧАНИЕ. находится в первой строке, вы попытаетесь напечатать неопределенное значение, что приведет к предупреждению.

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