perl如何从C头文件中提取#define的数字

时间:2018-08-24 23:19:39

标签: c perl c-preprocessor

我正在寻找一个Perl代码片段,以将C头中包含的数字100打印到终端。

#ifndef VERSIONS_H
#define VERSIONS_H

#define __SOFTWARE_REVISION__ 100

#endif

我可以提取#define行,但可以提取数字。

#!perl -w
use warnings;
use strict;
my $line;
my $file = shift @ARGV;
open my $fh, "<", $file or die $!;
while (<$fh>) {
        print if /__SOFTWARE_REVISION__/;
}
close ($fh);

2 个答案:

答案 0 :(得分:4)

regex匹配包含该文字短语的任何行,不仅限于定义的地方。您需要更精确地指定行,并捕获所需的数字。

代码还会继续不必要地遍历文件。

还有一些调整

use warnings;
use strict;
use feature qw(say);

my $file = shift @ARGV;
die "Usage: $0 filename\n" if not $file or not -f $file;

open my $fh, '<', $file or die "Can't open $file: $!";

while (<$fh>) {
    if (/^\s*#\s*define\s+__SOFTWARE_REVISION__\s+([0-9]+)/) {
        say "Software revision: $1";
        last;
    }
}
close $fh;

如果软件版本可以不是整数,则将[0-9]+替换为\S+

我建议您参考参考文献perlretut通读教程perlre


我认为Perl程序中会出现这种需求(而不是Perl是为此选择的工具)。

仍然请注意,还有其他更系统的方法可以使用编译器检索此信息(例如,请参见ricigcc的评论)。

虽然最好在Perl脚本中使用Perl而不是直接进入系统,但这种情况可能是例外之一:使用外部命令而不是解析源可能更好文件,这是众所周知的危险任务。

答案 1 :(得分:2)

这是一种使用正则表达式来捕获版本号(如果存在于一行中)的方法。请注意,正则表达式中的括号界定了捕获组,并且变量$1用于访问捕获。

#!perl -w
use warnings;
use strict;

my $file = shift @ARGV;
open my $fh, "<", $file or die $!;

while (<$fh>) {
    print "$1\n" if /^#define +__SOFTWARE_REVISION__ +(\d+)$/;
}

close $fh;

输出:

100

正则表达式比您的正则表达式更具选择性,它匹配一行中任何__SOFTWARE_REVISION__的实例。此正则表达式在行的开头匹配#define,后跟一个或多个空格,然后是__SOFTWARE_REVISION__,然后是一个或多个空格,然后是末尾的一个或多个数字捕获组。线。