我有一个头文件,我想要在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并匹配换行符。但这似乎也无济于事。
答案 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(.*)/;
}