2011-04-21 85 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