Tcl FindFiles:lappend问题

Tcl FindFiles:lappend问题,tcl,Tcl,我已经编写了FindFile.tcl的一个过程。它将在all子目录中找到所有的.v、.sv和.vhd,并附加到一个列表($tb_文件)。无论如何,它只是附加了它们的一部分。假设它应该附加所有文件 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 请指教。非常感谢。谢谢。我想您还不

我已经编写了FindFile.tcl的一个过程。它将在all子目录中找到所有的.v、.sv和.vhd,并附加到一个列表($tb_文件)。无论如何,它只是附加了它们的一部分。假设它应该附加所有文件

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
请指教。非常感谢。谢谢。

我想您还不了解进程调用在Tcl中是如何工作的。你有几行这样的话

set a $a

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

您的主要问题是希望从子目录中积累文件,但实际上并没有这样做。您也没有很好地使用
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
}

(这些glob术语实际上都不需要双引号。我这样做只是为了突出显示语法!)

我已经删除了所有设置a$a。它仍然不起作用。此外,第一个foreach中附加的列表在到达第二个foreach时丢失。真正的关键是使用
glob
的功能;这对你很有帮助。我也可以使用
-tails
选项,除非我真的不喜欢它。:-)建议#1:使用tcllib fileutil::findByPattern做您想做的事。。。
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
}