在perl中处理多行模式

时间:2011-04-21 08:57:33

标签: regex 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文件中一次读取一行。所以我首先将我的文件流转换为单个变量。

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

}  

如果是多行模式,有人可以帮助我在{}中搜索文本。请尽快回复...... :)

1 个答案:

答案 0 :(得分:3)

首先,有一个更好的习惯用于诽谤文件:

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

接下来,您可以在regexp上设置/ s修饰符,它通过允许'。'将字符串视为单行。 (点)匹配任何包括换行符。但即使这样也不是必要的,因为你不会在你的正则表达式中使用'dot'.......

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";
}

另一种解决方案是将输入记录分隔符$ /设置为'}'。这样你就可以以一个以结束括号结尾的块来读取文件。漂亮的技巧。