2011-04-21 86 views
0

我正在爲我的移動平臺添加新的語言支持。我必須在幾個文件中爲每種語言添加條目,所以我認爲要使用perl來完成。要自動執行此過程,我感覺如何在perl中匹配多行模式的問題。 這裏是我的情況:在Perl中處理多行模式

const mmi_imeres_mode_details_struct g_ime_mode_array_int[] = 
{  
    { 
    INPUT_MODE_NONE, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0 
    }, 
    { 
    INPUT_MODE_MULTITAP_LOWERCASE_ABC, 
    STR_INPUT_METHOD_MENU_MULTITAP_abc, 
    WGUI_IME_MULTITAP_LOWERCASE_ABC_IMG, 
    INPUT_MODE_DEFAULT_ALTERNATE_METHOD, 
    MMI_IME_ALL_EDITORS | MMI_IME_ENGLISH_ONLY_MODE | MMI_IME_ALPHABETIC | MMI_IME_LOWERCASE, 
    MMI_IMM_WRITING_LANGUAGE_ENGLISH, 
    "en-US" 
    }, 

}

首先是因爲在Perl文件在time.so我在單變量先轉換我的文件流讀取一行我有問題。

my $newstr = ''; 
open (FH, "$filename") || die "Could not open file.\n"; 
while(<FH>) 
{ 
    $newstr = $newstr.$_; 

} 

沒有有人可以幫助我如何搜索中{}的文本,如果它是一個多線pattern.please儘快答覆... :)

回答

3

首先,有一個爲啜更好的成語文件:

my $newstr; 
{ 
    open my $fh, '<', $filename or die "Could not open file $filename.\n$!\n"; 
    local $/ = undef; 
    $newstr = <$fh>; 
} 

接下來,你可以在你的正則表達式,它允許將字符串作爲單行設置/ s修正「」 (點)以匹配任何東西,包括換行符。但是,即使這不是真的有必要,因爲你不會在你的正則表達式使用「點」反正.....

while( 
    $newstr =~ m/ 
     {  # Match the opening bracket. 
     ([^}]*) # Capture any number of characters that exclude '}' 
     }  # Match the closing bracket. 
    /gx   # Use /g for multiple matches, and /x for readability. 
) { 
    print "$1\n"; 
} 

另一個解決方案是設置你的輸入記錄分隔符,$ /,到「}」 。這樣你就可以以結尾括號結尾的塊來讀取文件。漂亮的把戲。

+0

thnx很多讓我試試.. – 2011-04-21 09:28:42

+0

你知道,我不是很滿意我以前的答案。雖然這在技術上是正確的,但它並沒有考慮到更大的任務。你正在解析嵌套標籤。爲此,請使用解析模塊;不要嘗試推出自己的正則表達式解決方案。它變得非常複雜。相反,使用Parse :: RecDescent或Parse :: RecDescent :: Simple來提高準確性,減少頭痛,並在晚上更好地睡眠。 – DavidO 2011-04-21 09:42:39

+0

是的,你是對的,從長遠來看這是沒有益處,但cpan是相當浩大的使用。但我會盡量..thnx爲你的建議..真正有用... :) – 2011-04-21 09:57:18