2011-11-01 84 views
3

我有我需要测试的设备的输出,主要是响应是一行,但有时它是两行。我用一个简单的正则表达式解析一行或两行如何Perl递归正则表达式

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

但是,如果响应超过两行处理?此代码无法处理额外的线条,我想在我的设计中保持健壮。有没有办法从正则表达式中捕获用于foreach

+1

你应该提供一些输入和一些理想的输出。无法帮助你没有这两个:) – FailedDev

回答

5

为什么不使用split函数来代替?以下是使用的link to some examples。对于你的榜样,为什么不这样做:

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

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

foreach my $line (@lines) 
{ 
    TestPrompt($string, $line); 
} 
+1

+1我建议'@lines> 1'而不是你的'$#行'检查。 – pilcrow

+0

@pilcrow,done ...同时替换'。'为了更好的可读性,使用双引号字符串文字连接Note的参数。 –

+0

看起来就像我所需要的,现在我需要弄清楚为什么我不能想到'split';) –

2

你可以在换行拆分:

my @lines = split /\r\n/, $prompt; 
foreach (@lines) { 
    TestPrompt($string, $_); 
} 
0

您可以使用在列表上下文中的全局匹配:

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