这个问题是我last question ...
的后续问题我在答案中遇到了一些问题。 好的,故事就是这样。我正在尝试编写一个与电子设计查看器程序协作的脚本。我遇到的问题是在电子程序的语法中正确使用我的变量。
所以基本上就是这个意思。我读了一些设计,将数组中的不同路径保存起来然后逐个读出来。在阅读过程中,我逐一打开它们。
打开程序布局的原始代码是:
set L1 [ layout create ]
$L1 create cell layout
$L1 create cell ONE
$L1 create cell TWO
set ONE [ layout create /users/jerre_111/public/imec_logo_zwart_512.gds -dt_expand -log LUN.log]
set ONE_top [$ONE topcell]
set TWO [ layout create /users/jerre_111/public/logo-rood.gds -dt_expand -log KTH.log]
set TWO_top [$TWO topcell]
$L1 import layout $ONE FALSE overwrite
$L1 import layout $TWO FALSE overwrite
$L1 create ref ONE $ONE_top 0 0 0 0 1
$L1 create ref TWO $TWO_top 0 0 0 0 1
$L1 create ref build ONE 0 0 0 0 1
$L1 create ref build TWO 207500 0 0 0 1
所以,这是原始代码。 ONE
和TWO
都是我在程序中打开的两种不同布局。
这就是它在我的脚本中的工作方式:我想用我打开的文件的名称动态替换ONE和TWO。所以每次,我都会从数组中获取路径,然后从路径中获取名称。然后我想使用文件名而不是ONE
和TWO
。我正在尝试这样:
set L1 [ layout create ]
$L1 create cell build
foreach key [array names ::openedFiles] {
set filename [file tail $::openedFiles($key)]
set parts [split $filename .]
set name [lindex $parts 0]
$L1 create cell $name
set $name[ layout create $::openedFiles($key) -dt_expand -log LUN.log]
set cell_top [[set $name] topcell]
$L1 import layout [set $name] FALSE overwrite
$L1 create ref $name $cell_top 0 0 0 0 1
$L1 create ref build $name 0 0 0 0 1
}
所以每次循环都会从数组中得到一个项目。然后我动态地给他们起名字。但是我在原始代码中遇到了$ONE
或ONE
的问题......我正在尝试将ONE
替换为$name
的值。 ..
我希望你理解我的问题,有人可以帮助我。
答案 0 :(得分:3)
对于此代码,您可能希望使用别名变量。
# Compute the name of the variable to use as in your code...
# I assume that the name is what $name produces
upvar 0 $name ALIAS
之后,您可以使用ALIAS
或$ALIAS
原始样本使用ONE
或$ONE
;它们的行为相同(直到堆栈帧或结束,直到您使用另一个upvar 0
调用重新定义别名)。
$L1 create cell ALIAS
set ALIAS [layout create $::openedFiles($key) -dt_expand -log LUN.log]
set cell_top [$ALIAS topcell]
$L1 import layout $ALIAS FALSE overwrite
$L1 create ref ALIAS $cell_top 0 0 0 0 1
$L1 create ref build ALIAS 0 0 0 0 1
唯一的问题可能是代码保留对变量名称的引用。我猜这个代码没有,但有些肯定会这样做。
或者使用数组,因为事情似乎需要一个标量。您甚至可以使用空名称的数组:
$L1 create cell ($name)
set ($name) [layout create $::openedFiles($key) -dt_expand -log LUN.log]
set cell_top [$($name) topcell]
$L1 import layout $($name) FALSE overwrite
$L1 create ref ($name) $cell_top 0 0 0 0 1
$L1 create ref build ($name) 0 0 0 0 1
我不建议使用空名;虽然它肯定会在整个8. *系列的Tcl中得到支持,但它在库包中使用(特别是stooop),我们不确定我们是否会保证这是9.0中的受支持功能。具有单字母名称的数组将更清晰IMO。