- 论坛徽章:
- 0
|
要用到perl来递归展开一个file里include file的内容。
将文件yyz.f中的-f 后面所带的文件内容递归展开,并输出到新的file
1.文件yyz.f 如下:
-INCDIR ./tmp
-f ./tmp/add_include_dir
./tmp/yyz1.v
2. 文件add_include_dir 如下:
-INCDIR ./tmp1
-INCDIR ./tmp2
-INCDIR ./tmp3
-f ./tmp/add_include_dir1
-INCDIR ./tmp4
-INCDIR ./tmp5
需要将add_include_dir1的内容也递归的展开
3.文件add_include_dir1的内容如下:
-INCDIR ./tmp10
-INCDIR ./tmp11
-INCDIR ./tmp12
-INCDIR ./tmp13
展开看新生成的文件应该如下:
-INCDIR ./tmp
-INCDIR ./tmp1
-INCDIR ./tmp2
-INCDIR ./tmp3
-INCDIR ./tmp10
-INCDIR ./tmp11
-INCDIR ./tmp12
-INCDIR ./tmp13
-INCDIR ./tmp4
-INCDIR ./tmp5
程序运行之后,少了后边的
-INCDIR ./tmp4
-INCDIR ./tmp5
两行,看起来是在递归执行的时候,强制退出了。
请大神们帮忙看一下,谢谢啦!
程序如下:- #! /usr/bin/perl
- use File::Basename;
- use Getopt::Long;
- my $USAGE= "This script auto extend filelist based on input filelist.
- Option: -f_list: <Must> Specify your debussy filelist
- -out_file: <Must> Specify the output file name\n";
- GetOptions("f_list=s"=>\$f_list,
- "out_file=s"=>\$out_file);
- if ($f_list eq "" or $out_file eq "") {
- print "$USAGE\n";
- exit;
- }
- open OUT, "> $out_file" or die "Cannot open $out_file for write\n";
- open F_IN, "< $f_list" or die "Cannot open $f_list \n";
- while (chomp(my $line = <F_IN>)) {
- $line =~s/\$(.*?)\//$TEMP{$1}\//g;
- if ($line =~ /^\s*\/\//) {
- next;
- } elsif ($line =~ /-INCDIR\s+(.*)/) {
- push @inc, $1;
- $line =~s/-INCDIR /+incdir+/g;
- print OUT "$line\n";
- } elsif ($line =~/^\s*-f\s+(\S+)/) {
- print OUT "\/\/Unfold-this-line-in-below: $line\n";
- print "\/\/Unfold-this-line-in-below: $line\n";
- my $f = $1;
- my @add_file = &find_add_file($f);
- print "DEBUG: add file is \(@add_file\)\n";
- foreach my $add (@add_file) {
- if ($add =~ /\+incdir\+(\S+)/) {push @inc, $1;}
- print OUT "$add\n";
- }
- } else {
- print OUT "$line\n";
- }
- }
- close(OUT);
- #+++++++++++++++++++++++++++++++++++++++++++
- # Sub Func : Find add file
- #+++++++++++++++++++++++++++++++++++++++++++
- sub find_add_file {
- my @return_file;
- my $line = shift @_;
- if (-e $line) {
- open ADD_F, "< $line" or die "Cannot open file $line\n";
- while (chomp(my $l = <ADD_F>)) {
- if ($l =~ /^\s*-INCDIR\s+(\S+)/) {
- push @return_file, "+incdir+$1";
- } elsif ($l =~ /^\s*-f\s+(\S+)/) {
- print "DEBUG: found include file line $l\n";
- my $add = $1;
- my @return_2 = &find_add_file($add);
- push @return_file,@return_2;
- } elsif ($l !~/^\s*$/) {
- push @return_file, $l;
- }
- }
- close(ADD_F);
- } else {
- print "Error: Cannot find $line, Please help check!\n";
- }
- return(@return_file);
- }
复制代码 |
|