0

假设 DirectoryA包含两个文件,fileA并且netlist.tcl. 以下是相关信息fileA

Source "netlist.tcl"
cell "chklist"

我希望当用户fileA在 GUI 的 Combobox 中选择时,在netlist字符串字段中自动选择:-netlist.tcl来自fileA弹出窗口和cell string字段的真实路径:-来自弹出窗口的单元格名称fileA

如何达到上述结果?输出:

A/netlist.tcl
chklist
4

2 回答 2

1

有几种方法可以解析这样的文件。这是带有安全儿童口译员的更好的口译员之一:

interp create -safe i
i alias Source netlistSource
i alias cell netlistCell

proc netlistSource {filename} {
    global fn
    set fn $filename
    return
}
proc netlistCell {cellname} {
    global cn
    set cn $cellname
    return
}

i invokehidden source "fileA"
interp delete i

这将存储netlist.tclfnchklistcn。我不确定A/前缀来自哪里,所以我把那部分省略了。


真实代码可能需要设置更多别名。我希望你能看到这样做是多么容易。请记住,在子解释器中调用别名,但在父解释器中调用您指定的代码;这有点像进行操作系统系统调用,但开销要少得多。(安全解释器默认禁用/隐藏所有触及操作系统的命令。)

于 2021-08-06T16:39:53.943 回答
1

如果您只需要基本的文件 I/O 和字符串匹配,那么这将是一个开始。您只需将其调整为您使用 GUI 所做的任何事情。

# File I/O
set fp [open fileA "r"]
set lines [split [read $fp] "\n"]
close $fp

# Check lines for netlist and cell
foreach line $lines {
    if {[string match "Source*" $line]} {
        set netlist [lindex $line 1]
        if {[file exists $netlist]} {
            puts [file normalize "./$netlist"]
        }

    }

    if {[string match "cell*" $line]} {
        set cell [lindex $line 1]
        puts "$cell"
    }
}

有多种方法可以完成此类工作。正则表达式与字符串匹配。在 Tcl 中打开文件 vs 执行对 grep 的系统调用 vs 使用 fileutil 包...

这里没有 Tcl 介绍中未涵盖的内容,例如https://wiki.tcl-lang.org/page/Tcl+Tutorial+Index。了解您已经尝试过的内容会很有帮助。

如果您了解正在发生的事情,Donal 之前使用安全口译员的回答也很酷。

于 2021-08-07T13:13:07.363 回答