Регулярное выражение соответствует любой строке, содержащей эту буквальную фразу, а не только там, где она определена. Вам нужно указать строку гораздо точнее, и захватить нужное число.
Код также продолжает без необходимости циклически проходить по файлу.
С некоторыми дополнительными настройками
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 является выбранным инструментом для этого).
Тем не менее, обратите внимание, что существуют другие, более системные, способы получения этой информации с помощью компилятора (см. Комментарий к gcc
по rici , например).
Хотя лучше использовать Perl в сценарии Perl, чем выходить в систему, этот случай может быть одним из исключений: может быть лучше использовать внешнюю команду, а не анализировать исходные файлы задача, которая, как известно, коварна.