我正在寻找一个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);发布于 2018-08-25 07:31:46
正则表达式匹配包含该文字短语的任何行,而不仅仅是定义它的位置。您需要更精确地指定行,并捕获所需的数字。
代码还会对文件进行不必要的循环。
再做一些调整
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是用于此目的的首选工具)。
不过,请注意,还有其他更系统的方法可以使用编译器检索此信息(例如,请参阅rici对gcc的评论)。
虽然在Perl脚本中使用Perl比在系统中使用Perl更好,但这种情况可能是一个例外:使用外部命令可能比解析源文件更好,后者是众所周知的危险任务。
发布于 2018-08-25 07:31:24
下面是一种使用正则表达式捕获版本号的方法。请注意,正则表达式中的括号分隔捕获组,变量$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__,然后是一个或多个空格,最后是一行末尾的一个或多个数字捕获组。
https://stackoverflow.com/questions/52012766
复制相似问题