How-To Perl рекурсивное регулярное выражение - PullRequest
3 голосов
/ 01 ноября 2011

У меня есть выходы от устройства, которое мне нужно проверить, и в большинстве случаев ответ - одна строка, но иногда это две строки.Что я обрабатываю с помощью простого регулярного выражения, разбирающего одну или две строки

if ($prompt =~ /(\s.*?)\r\n(.*)/)
{
   Note('Multiline '.$string);
   TestPrompt($string, $1);
   TestPrompt($string, $2);
}
else
{
   TestPrompt($string, $prompt);
}

Но что, если ответ будет более двух строк?Этот код не может обрабатывать дополнительные строки, и я хотел бы быть надежным в моем дизайне.Есть ли способ захвата из регулярных выражений для использования в foreach?

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Почему бы не использовать функцию split вместо этого?Вот ссылка на некоторые примеры использования .Для вашего примера, почему бы не сделать это:

my @lines=split /\r\n/,$prompt;

Note("Multiline $string") if @lines>1; 

foreach my $line (@lines) 
{ 
   TestPrompt($string, $line);
} 
2 голосов
/ 01 ноября 2011

Вы можете разделить на новые строки:

my @lines = split /\r\n/, $prompt;
foreach (@lines) {
    TestPrompt( $string, $_ );
}
0 голосов
/ 01 ноября 2011

Вы можете использовать глобальное совпадение в контексте списка:

    my @prompts = m{(\s*\S*?)\r\n}g;
    for my $prompt (@prompts) {
        print "$prompt\n";
    }
...