我想添加一个.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>/){
答案 0 :(得分:1)
想象一下,你有这个C档:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char ** argv) {
return 0;
}
当你的脚本通过时会发生什么? Nothing ,因为已经包含
虽然实际发生了什么?这是学习使用Perl调试器或简单地手动跟踪非常有用的地方。
flag
和pos
初始化为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;
}