Perl解析 - 字符,制表符和空格的混合

时间:2012-12-21 09:06:02

标签: perl parsing

我的代码中有以下类型的行:

MMAPI_CLOCK_OUTPUTS = 1,        /*clock outputs system*/
MMAPI_SYSTEM_MANAGEMENT = 0,    /*sys man system*/

我想解析它们以获得:

'MMAPI_CLOCK_OUTPUTS' 
'1'
'clock outputs system'

所以我试过了:

elsif($TheLine =~ /\s*(.*)s*=s*(.*),s*\/*(.*)*\//)

但这并没有得到最后一个字符串'时钟输出系统' 解析代码究竟应该是什么?

3 个答案:

答案 0 :(得分:1)

你应该逃避斜杠,星星和s空格。不要在正则表达式中写/*s,而是写\/\*\s

/\s*(.*)\s=\s*(.*),\s\/\*(.*)\*\//

答案 1 :(得分:1)

if($TheLine =~ m%^(\S+)\s+=\s+(\d+),\s+/\*(.*)\*/%) {
    print "$1 $2 $3\n"
}

这会使用%作为替代分隔符,以便在您转义/个字符时避免使用leaning toothpick syndrome

答案 2 :(得分:0)

试试这个正则表达式:/^\s*(.*?)\s*=\s*(\d+),\s*\/\*(.*?)\*\/$/

以下是您可以测试它的示例:

#!/usr/bin/perl
use strict;
use warnings;

my $str = "MMAPI_CLOCK_OUTPUTS = 1,        /*clock outputs system*/\n
           MMAPI_SYSTEM_MANAGEMENT = 0,    /*sys man system*/";

while ($str =~ /^\s*(.*?)\s*=\s*(\d+),\s*\/\*(.*?)\*\/$/gm) {
    print "$1 $2 $3 \n";
}

# Output:
# MMAPI_CLOCK_OUTPUTS 1 clock outputs system
# MMAPI_SYSTEM_MANAGEMENT 0 sys man system