检查后即使多次添加头文件

时间:2013-12-26 14:31:16

标签: regex perl

我想添加一个.C文件,因为它不存在。使用Perl

MY CODE SNIPPET

my $flag = 0;
my $pos = 0;
open(FILE, $input) or die $!;
my @lines = <FILE>;

foreach(@lines) 
{
   $pos++;

   #checks for #include where it can add stdint.h
   if ($_ =~ (m/#include/))
   {                

       #prevents multiple addition for each header file 
       if($flag == 0)
       {                     
             #checks whether stdint already present or not
             unless($_ =~ m/#include <stdint.h>/ )
             {         
             splice @lines,$pos,0,"#include <stdint.h>"."\n";
             $flag = 1;
        }
    }
   }
}

但我的代码每次运行时都会添加stdint.h,这意味着每次运行都需要多次添加。

代码错误

unless($_ =~ m/#include <stdint.h>/){
即使我使用

也不起作用

unless($_ =~ m/<stdint.h>/){

3 个答案:

答案 0 :(得分:1)

想象一下,你有这个C档:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char ** argv) {
   return 0;
}

当你的脚本通过时会发生什么? Nothing ,因为已经包含

虽然实际发生了什么?这是学习使用Perl调试器或简单地手动跟踪非常有用的地方。

flagpos初始化为0。文件中的第一行是#include <stdio.h>不是 #include <stdint.h>,因此您的代码会立即假定文件丢失并添加它。

因此,在上面的代码中,您在第一个包含的#include <stdint.h>上插入了<stdint.h>,无论它是否实际存在于文件的后面或之前,它始终是任何其他包含文件。

你应该做的是收集一个数组中的所有包含行,然后搜索匹配{{1}}的文件,只有在完整列表中没有包含它时才添加它。

答案 1 :(得分:1)

这是一种方法:

open(my $FILE, '<', $input) or die $!;
my @lines = <$FILE>;

my $flag = 0;
my $pos = 0;
my $insert_pos = 1; #add stdin even if there're no other include
foreach(@lines) {
    $pos++;
    if (/#include/){
        $insert_pos = $pos;
        if (/#include <stdint.h>/) {
            $insert_pos = 0;
            last;
        }
    }
}
if ($insert_pos) {
    splice @lines, $insert_pos, 0, "#include <stdint.h>"."\n";
}

答案 2 :(得分:0)

对C项目来说,这是一件非常糟糕的事情。

您编码的内容会在第一行#include <stdint.h>后添加#include,对不#include任何内容的文件都不会产生影响。

但是,如果您想使用Perl“编辑”文件,那么您应该使用Tie::File

您问题中的代码看起来像这样

use strict;
use warnings;

use Tie::File;

my ($input) = @ARGV;

tie my @c_file, 'Tie::File', $input or die qq{Unable to open C file "$input": $!};

for my $i (0 .. $#c_file) {
  next unless $c_file[$i] =~ /#include/;
  splice @c_file, $i, 0, '#include <stdint.h>';
  last;
}