FindFiles:lappend问题

时间:2012-04-07 19:03:06

标签: tcl

我编写了一个FindFile.tcl程序。它将在所有子目录中找到.v,.sv和.vhd并附加到列表($ tb_file)。无论如何它只附加了部分内容。假设它应该附加所有文件。

Result: Test_Plan.sv Test_Plan_Copy.sv sim_driver_2.sv
Expected Result: Test_Plan.sv Test_Plan_Copy.sv sim_driver_1.sv sim_driver_2.sv

我发现了什么: $tb_file在进入第二个foreach语句之前将遗漏列表中的一个元素;

我的FindFile.tcl

proc FindFiles { MY_TB_DIR tb_file } {
  set pwd [pwd];
  # set tb_file $tb_file
  set tb_file $tb_file
  # puts "after proc call testbench files are $tb_file"
  set MY_TB_DIR $MY_TB_DIR
  puts "after proc call tb_dir $MY_TB_DIR"
  set dir_file [glob -nocomplain -dir $MY_TB_DIR *];
  # puts $dir_file
  # set dir_file [glob -nocomplain *]

  foreach item $dir_file {
    set file [file tail $item];
    puts $file;
    switch -glob -- $file {
      *.v {lappend tb_file $file
        puts "Append $tb_file"
      }

      *.sv {lappend tb_file $file
        puts "Append $tb_file"
      }

      *.vhd {lappend tb_file $file
        # puts "Test bench file is $tb_file"
      }

      default {}
    };
    set tb_file $tb_file;
  };

  foreach item2 $dir_file {
    # recurse - go into the sub directory
    if { [file isdirectory $item2] } {
      set sub_dir [file join $MY_TB_DIR $item2] ;
      puts "\n\n before proc call $tb_file";
      puts " \n\n sub_dir $sub_dir";
      FindFiles $sub_dir $tb_file;
      # FindFiles $sub_dir
    }
  };
  # puts "Testbench are $tb_file"
  cd $pwd
}

请咨询。万分感激。感谢。

2 个答案:

答案 0 :(得分:2)

您的主要问题是您希望从子目录中累积文件,但实际上并没有这样做。您还没有使用glob的功能。这是我的看法:

proc FindFiles {MY_TB_DIR {accumulate_var ""}} {
    if {$accumulate_var ne ""} {
        upvar 1 $accumulate_var result
    }
    foreach file [glob -nocomplain -dir $MY_TB_DIR -type f "*.{v,sv,vhd}"] {
        lappend result [file tail $file]
    }
    foreach dir [glob -nocomplain -dir $MY_TB_DIR -type d "*"] {
        FindFiles $dir result
    }
    return $result
}

(这些全球术语中没有一个实际上需要用双引号。我只是用它来进行语法高亮!)

答案 1 :(得分:0)

我认为你还没有理解进程调用在Tcl中是如何工作的。你有几行像这样

set a $a

只是将变量设置为自己。它看起来好像你试图在嵌套调用中更新proc的参数,并期望结果在父proc中可用。 Tcl proc参数不起作用,您需要返回一个新列表并将其加入到您的结果中。