免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2785 | 回复: 3
打印 上一主题 下一主题

求教perl 递归函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-07 17:40 |只看该作者 |倒序浏览
要用到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
两行,看起来是在递归执行的时候,强制退出了。
请大神们帮忙看一下,谢谢啦!

程序如下:
  1. #! /usr/bin/perl
  2. use File::Basename;
  3. use Getopt::Long;

  4. my $USAGE= "This script auto extend filelist based on input filelist.
  5. Option: -f_list:     <Must> Specify your debussy filelist       
  6.         -out_file:   <Must> Specify the output file name\n";

  7. GetOptions("f_list=s"=>\$f_list,
  8.            "out_file=s"=>\$out_file);

  9. if ($f_list eq "" or $out_file eq "") {
  10.         print "$USAGE\n";
  11.         exit;
  12. }

  13. open OUT, "> $out_file" or die "Cannot open $out_file for write\n";
  14. open F_IN, "< $f_list" or die "Cannot open $f_list \n";
  15. while (chomp(my $line = <F_IN>)) {
  16.     $line =~s/\$(.*?)\//$TEMP{$1}\//g;
  17.         if ($line =~ /^\s*\/\//) {
  18.             next;
  19.     } elsif ($line =~ /-INCDIR\s+(.*)/) {
  20.             push @inc, $1;
  21.             $line =~s/-INCDIR /+incdir+/g;
  22.             print OUT "$line\n";
  23.     } elsif ($line =~/^\s*-f\s+(\S+)/) {
  24.             print OUT "\/\/Unfold-this-line-in-below: $line\n";
  25.             print "\/\/Unfold-this-line-in-below: $line\n";
  26.             my $f = $1;
  27.             my @add_file = &find_add_file($f);
  28.             print "DEBUG: add file is \(@add_file\)\n";
  29.             foreach my $add (@add_file) {
  30.                     if ($add =~ /\+incdir\+(\S+)/) {push @inc, $1;}
  31.                     print OUT "$add\n";
  32.             }
  33.     } else {
  34.             print OUT "$line\n";
  35.     }
  36. }
  37. close(OUT);


  38. #+++++++++++++++++++++++++++++++++++++++++++
  39. # Sub Func : Find add file
  40. #+++++++++++++++++++++++++++++++++++++++++++
  41. sub find_add_file {
  42.         my @return_file;
  43.         my $line = shift @_;
  44.         if (-e $line) {
  45.                 open ADD_F, "< $line" or die "Cannot open file $line\n";
  46.                 while (chomp(my $l = <ADD_F>)) {
  47.                         if ($l =~ /^\s*-INCDIR\s+(\S+)/) {
  48.                                 push @return_file, "+incdir+$1";
  49.                         } elsif ($l =~ /^\s*-f\s+(\S+)/) {
  50.                                 print "DEBUG: found include file line $l\n";
  51.                                 my $add = $1;
  52.                                 my @return_2 = &find_add_file($add);
  53.                                 push @return_file,@return_2;
  54.                         } elsif ($l !~/^\s*$/) {
  55.                                 push @return_file, $l;
  56.                         }
  57.                 }
  58.                 close(ADD_F);
  59.         } else {
  60.                 print "Error: Cannot find $line, Please help check!\n";
  61.         }
  62.         return(@return_file);
  63. }
复制代码

perl 递归问题.rar

1.68 KB, 下载次数: 2

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-12-07 22:16 |只看该作者
回复 1# yyzthinking


    ADD_F 是全局的,在递归之前应保存,递归调用之后恢复。当然,如果你要是在一开始就使用 indirect file handle 的话这个问题 perl 自动就帮你处理了。

论坛徽章:
0
3 [报告]
发表于 2015-12-08 10:18 |只看该作者
谢谢您,我试了一下open $ADD_F, “< xxx” 好像还是不行,还有需要特别注意的吗?回复 2# MMMIX


   

论坛徽章:
0
4 [报告]
发表于 2015-12-08 10:31 |只看该作者
回复 2# MMMIX

可以了,刚刚我少写了一个my 用open my $ADD_F, “< xxx” 就可以了,非常感谢!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP