我正在寻找一个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);
答案 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是为此选择的工具)。
仍然请注意,还有其他更系统的方法可以使用编译器检索此信息(例如,请参见rici对gcc
的评论)。
虽然最好在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__
,然后是一个或多个空格,然后是末尾的一个或多个数字捕获组。线。