我想更新一个以宏形式存在的C文件中的发行版号。我想在perl中实现它。我做了一个小的实现,但是我很想了解这是否是正确的解决方案,或者可以对其进行进一步优化。
C文件(输入文件:test_file.c)如下所示:
INPUT_FILE(test_file.c)
#include "header_file.h"
#define ALPHA_MAJOR_VERSION 100
#define ALPHA_MINOR_VERSION 20
#define BETA_MAJOR_VERSION 1
#define BETA_MINOR_VERSION 2
#define DELTA_BRANCH_VERSION 3
#if ((ALPHA_MAJOR_VERSION != SOME_VERSION) || \
(ALPHA_MINOR_VERSION != SOME_OTHER_VERSION))
#error Versions do not match
typedef int fix_this_compiler_error;
#else
typedef int fix_this_compiler_error;
#endif
可以说发布号为101p1p2p3p4
,我想拆分此发布号并更新C文件中的宏,如下所示:
#define ALPHA_MAJOR_VERSION 101
#define ALPHA_MINOR_VERSION 1
#define BETA_MAJOR_VERSION 2
#define BETA_MINOR_VERSION 3
#define DELTA_BRANCH_VERSION 4
在发行版编号101p1p2p3p4
中,每个p
版本之后的值都是发行版的主要/次要版本,并且需要在C文件中进行更新。因此,所需的输出如下所示:
DESIRED_OUTPUT
#include "header_file.h"
#define ALPHA_MAJOR_VERSION 101
#define ALPHA_MINOR_VERSION 1
#define BETA_MAJOR_VERSION 2
#define BETA_MINOR_VERSION 3
#define DELTA_BRANCH_VERSION 4
#if ((ALPHA_MAJOR_VERSION != SOME_VERSION) || \
(ALPHA_MINOR_VERSION != SOME_OTHER_VERSION))
#error Versions do not match
typedef int fix_this_compiler_error;
#else
typedef int fix_this_compiler_error;
#endif
MY_IMPLEMENTATION
#!/usr/bin/perl
use strict;
use warnings;
my $release_num = "101p1p2p3p4";
my @array = split(/p/, $release_num);
my @versions;
for (my $i=0; $i<scalar(@array); $i++)
{
$versions[$i] = $array[$i];
}
print "array is : @versions \n";
print "0 : $versions[0] \n";
print "1 : $versions[1] \n";
print "2 : $versions[2] \n";
print "3 : $versions[3] \n";
print "4 : $versions[4] \n";
my $file = '/path/to/the/file/test_file.c';
`sed -i '/^\#define ALPHA_MAJOR_VERSION/ c\\#define ALPHA_MAJOR_VERSION $versions[0]' $file`;
`sed -i '/^\#define ALPHA_MINOR_VERSION/ c\\#define ALPHA_MINOR_VERSION $versions[1]' $file`;
`sed -i '/^\#define BETA_MAJOR_VERSION/ c\\#define BETA_MAJOR_VERSION $versions[2]' $file`;
`sed -i '/^\#define BETA_MINOR_VERSION/ c\\#define BETA_MINOR_VERSION $versions[3]' $file`;
`sed -i '/^\#define DELTA_BRANCH_VERSION/ c\\#define DELTA_BRANCH_VERSION $versions[4]' $file`;
通过我的实现,我能够获得所需的输出,如上所示,但想了解这是解决此问题的正确方法,否则可能会有更好的方法。
我之前也问过类似的问题,但是由于我没有分享我的作品,主持人将其关闭。我希望这个问题不会解决,因为我已尽力提出解决方案。谢谢!
链接到已关闭的问题:如何使用Perl更新C文件中的宏
您可以使用类似此脚本的内容。
#!/usr/bin/env perl
use strict;
use warnings;
my $release_num = "101p1p2p3p4";
my @versions = split(/p/, $release_num);
my $file = "test_file.c";
my $backext = "";
{
local ($^I, @ARGV) = ($backext, $file);
while (<>) {
s/#define ALPHA_MAJOR_VERSION\s+\K\d+/$versions[0]/;
s/#define ALPHA_MINOR_VERSION\s+\K\d+/$versions[1]/;
s/#define BETA_MAJOR_VERSION\s+\K\d+/$versions[2]/;
s/#define BETA_MINOR_VERSION\s+\K\d+/$versions[3]/;
s/#define DELTA_BRANCH_VERSION\s+\K\d+/$versions[4]/;
print;
}
}
1;
sed
不需要运行外部命令(就像使用一样)。当Perl可以完成外部命令可以完成的任务时,外部命令会增加处理分支的昂贵开销。
在$^I
打开就地编辑。它模仿Perl的-i
开关。要操作的文件来自操作员@ARGV
读取的文件<>
。作为一种好的实践,我们通过创建一个带有大括号的块来本地化这些实体的动作,并声明局部变量。如果设置$backext
为空字符串,则不会保留任何备份副本,否则,该字符串将附加到原始文件名后并保留原始文件。
采用\K
的替代将文字到比赛的左侧。这样可以保留定义和值之间的原始空间。
我将最终1;
代码用作脚本代码结尾的标记。除非您正在编写软件包或模块,否则这无关紧要。在这种情况下,文件必须最后返回true作为arequire
或use
指令成功的最后一条语句。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句