Хорошо, что вы используете 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 = $_;
}
* ПРИМЕЧАНИЕ. находится в первой строке, вы попытаетесь напечатать неопределенное значение, что приведет к предупреждению.