2014-02-10 7 views
0

Если у меня есть следующие данные:Perl регулярное выражение матч по multple линий

<br/> 
    help can be found... 

Так что я получил это с отношени фактических данных:

<br/>\n\s\s\s\shelp can be found 

Я не могу понять, почему , но Perl не находит эти соответствия. Я использую следующий код:

my $filename = $ARGV[0]; 

open(INFILE, "<", $filename); 

while (<INFILE>){ 
    if (/(\<br\/\>.*\s{4}[A-Z])/msi){ 
     print $1."\n"; 
} 
} 

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

+1

Вы обрабатываете каждую линию индивидуально. Посмотрите ответ на http://stackoverflow.com/questions/5862461/problem-with-perl-multiline-matching?rq=1. – user1937198

+0

Я думал, что файл разрывает файл. Он все еще не работает, если я делаю $/= undef; – user1236443

+0

@ThisSuitIsBlackNot У него есть опция i, поэтому будет – user1937198

ответ

0

<INFILE> в цикле while загружает каждую строку в $_ отдельно. Поэтому для соответствия между строками вам нужно установить $/ в undef. Затем вам необходимо переместить цикл while в регулярное выражение и использовать глобальный флаг для установки нескольких совпадений.

my $filename = $ARGV[0]; 

$/ =undef; 

open(INFILE, "<", $filename); 

my $file = <INFILE>; 

while ($file =~ /(\<br\/\>.*\s{4}[A-Z])/msig){ 
    print $1, "\n"; 
} 
+0

Этот код говорит мне, что использование неинициализированного значения $ _ в совпадении с шаблоном (m //) – user1236443

+0

Это означает, что «main :: line» используется только один раз: возможная опечатка. Также появляется использование неинициализированного значения $ line в соответствии с шаблоном – user1236443

+0

Спасибо. но это просто печатает весь файл, а не только шаблон совпадает. – user1236443

Смежные вопросы