2011-11-01 87 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"; 
    }