首页 > 解决方案 > 用于从目录中的文件中提取元素并制作列表的 TCL 脚本

问题描述

我有一个问题,如下所述

问题描述

我有一些“sv”扩展文件,我正在使用“glob”来提取匹配文件,现在在这些匹配文件中,我需要拆分它们并提取元素并创建不同的列表。

例如

set files [glob -type f modified_rtl_files/*/*{wrapper_hsm}*]

这个命令给了我这两个文件:

modified_rtl_files/mbist_wrapper/mbist_wpper_hsm_pkram.sv modified_rtl_files/mbi_wrapper/mbist_wrapper_hsm_sysram.sv

现在我正在使用以下命令提取文件名

foreach element $files {
set c [split [ file tail [ file rootname $element ] ] "_" ]
echo $c
}

这是给我

pkram
sysram

但我需要将它们设置为两个独立的列表

$mem1 
$mem2 
$mem1 should be pkram 
$mem2 should be sysram 

每当我试图创建这样的东西时,这两个元素都会被打印出来

foreach element $files {                                                                                              
set c [split [ file tail [ file rootname $element ] ] "_" ]                                                                      
set d [ lindex $c 3]                                                                                                             
set mem1 [ lindex  $d 0 ]                                                                                                        
puts $mem1                                                                                                                       
}

它正在打印

pkram 
sysram 

我想要自变量。

标签: tcl

解决方案


可以使用以下方法生成名称set

foreach element [lsort $files] {
    set mem[incr i] [lindex [split [file tail [file rootname $element]] "_"] 3]
    puts [set mem$i];  # <<< How to *READ* a variable with a generated name
}

glob如果您完全关心订单,请始终对输出进行排序;不能保证以任何顺序或任何一致性出现)。

但不要这样做!

生成的变量名使用起来很痛苦,因为它们不能与$语言语法一起使用。您最好使用(关联)数组,因为它们确实可以使用:

foreach element [lsort $files] {
    set mem([incr i]) [lindex [split [file tail [file rootname $element]] "_"] 3]
    puts $mem($i)
}

这些值不会在mem1and中mem2,而是在mem(1)and中mem(2)


推荐阅读