首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl如何从C头文件中提取#define'd数字

perl如何从C头文件中提取#define'd数字
EN

Stack Overflow用户
提问于 2018-08-25 07:19:39
回答 2查看 283关注 0票数 1

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

代码语言:javascript
复制
#ifndef VERSIONS_H
#define VERSIONS_H

#define __SOFTWARE_REVISION__ 100

#endif

我能够提取#define行,但是数字。

代码语言:javascript
复制
#!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);
EN

回答 2

Stack Overflow用户

发布于 2018-08-25 07:31:46

正则表达式匹配包含该文字短语的任何行,而不仅仅是定义它的位置。您需要更精确地指定行,并捕获所需的数字。

代码还会对文件进行不必要的循环。

再做一些调整

代码语言:javascript
复制
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.]+替换[0-9]+,或者如果版本控制中允许使用(小写)字母,则替换为[0-9.a-z] ...或者只是简单的\S+

我建议在手头有参考perlre的情况下完成教程perlretut

我假设这种需求出现在Perl程序中(而不是Perl是用于此目的的首选工具)。

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

虽然在Perl脚本中使用Perl比在系统中使用Perl更好,但这种情况可能是一个例外:使用外部命令可能比解析源文件更好,后者是众所周知的危险任务。

票数 4
EN

Stack Overflow用户

发布于 2018-08-25 07:31:24

下面是一种使用正则表达式捕获版本号的方法。请注意,正则表达式中的括号分隔捕获组,变量$1用于访问捕获。

代码语言:javascript
复制
#!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;

输出:

代码语言:javascript
复制
100

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52012766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档