如何在perl的后续行中匹配第一行和存储正则表达式匹配?

时间:2014-12-19 00:07:25

标签: regex perl newline

我有一个头文件,我想要在perl中使用正则表达式提取一些变量。

以下是头文件的一部分:

banana.h

/******************************************************************************/
//  BANANA               = 1,
/******************************************************************************/
#define BANANA_FAMILY_GREEN         0x01
#define BANANA_FAMILY_YELLOW        0x02
#define BANANA_FAMILY_SPECIAL       0x03

#define BANANA_MAJOR_VER_SWEET      0x01
#define BANANA_MAJOR_VER_BITTER     0x02

#define BANANA_MINOR_VER_BIG      0x01
#define BANANA_MINOR_VER_SMALL     0x02
/******************************************************************************/
//  POTATO               = 2,
/******************************************************************************/
.
.
.

假设我要匹配“BANANA = 1”,还要“/ ******************************* *************** /“用模式”#define“找到它下面的模式并提取”BANANA_FAMLY_GREEN 0x01“等等。

以下是我使用的正则表达式模式:

if ($banana_header =~ m/.*\s*BANANA\s*\=\s*\d+\s*.+/)
{
    next;
    if ($banana_header =~ m/#define\s*(\w+)\s*0x(\d+)\s*/)
    {
        print "word:$1\n";
        print "digit:$2\n";
    }
}

但是我似乎无法进入第二个if条件的方法,是否有我在这里缺少的东西?我尝试过使用modifier / s并匹配换行符。但这似乎也无济于事。

2 个答案:

答案 0 :(得分:1)

正如@choroba所提到的那样next;使其余部分无法访问。除此之外,无论如何都不会达到第二个if语句,因为下一轮将包含下一行,因此打印匹配的代码仍然无法到达。我不确定你是如何填充$ banana_header,但假设你正在读STDIN,这应该有效:

$fruit_flag=0;
while(<STDIN>)
{
    chomp;
    $banana_header=$_;
    if ($fruit_flag == 0 && $banana_header =~ m/.*\s*BANANA\s*\=\s*\d+\s*.+/)
    {
        $fruit_flag=1;
        next;
    }

    if ($fruit_flag)
    {
        if ($banana_header =~ m/#define\s*(\w+)\s*0x(\d+)\s*/)
        {
            print "word:$1\n";
            print "digit:$2\n";
        }
        elsif ($banana_header =~ m/\/\//)
        {
            $fruit_flag=0;
        }
    }
}

答案 1 :(得分:0)

尝试这样做:

BEGIN { $/ = "\000"; $\ = undef; }
while (defined($_ = <ARGV>)) {
    print $1, $2 if /\b(BANANA\s*\=\s*\d+),\s*\n.*\n#define(.*)/;
}