使用Perl更新C文件中的宏

亚什

我想更新一个以宏形式存在的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作为arequireuse指令成功的最后一条语句

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章