如何在每 运行 后更新 TCL 文件中的标志位?

how to update the flag bits in TCL file after every run?

我正在编写自动化脚本,其中测试 运行s 是否在 data.tcl 文件中将特定标志位设置为 1。 完成第一个任务后,我需要将 MAC 标志值重置为 0,我需要将 xmac 标志文件 1 和剩余标志设置为 0。

在 运行ning 测试脚本标志值之前 data.tcl

set mac 1 
set xmac 0 
set fea 0 
set fea1 0 

第一个 运行 之后:data.tcl 文件的预期内容:

  set mac 0 
  set xmac 1 
  set fea 0 
  set fea1 0 

在第二个 运行 之后:data.tcl 文件的预期内容:

  set mac 0 
  set xmac 0 
  set fea 1 
  set fea1 0 

第 3 个 运行 之后:data.tcl 文件的预期内容:

  set mac 0 
  set xmac 0 
  set fea 0 
  set fea1 1 


   fileutil::replaceInFile data.tcl 30 1 0 

上面的命令将位置 31 的值重置为 0,但在我的例子中,每个标志都具有不同的长度名称,因此我们不能使用位置指针来设置和重置标志 我使用 fileutil 包尝试了一些命令,但无法获得正确的结果。你能帮我用这段代码在每个 运行 之后设置和重置标志吗?

诀窍是想出一种不需要索引到文件的映射方法。

proc setDataState {filename mapping} {
    set f [open $filename]
    set lines [split [read $f] "\n"]
    close $f

    set f [open $filename "w"]
    foreach line $lines {
        if {[regexp {^(\s*set\s+(\w+)\s+)\w+(.*)$} -> head key tail] && [dict exists $mapping $key]} {
            set line $head[dict get $mapping $key]$tail
        }
        puts $f $line
    }
    close $f
}

这样您就可以以可控的方式更改文件,可能像这样:

setDataState data.tcl {
    mac 0 
    xmac 1 
    fea 0 
    fea1 0 
}

好的,这样就可以进行编辑了,但真正的关键是您可以通过变量提供状态字典;这让你可以做更复杂的事情:

# This shuffles the “1” along
set statedict [dict create  mac 0  xmac $mac  fea $xmac  fea1 $fea]
setDataState data.tcl $statedict

我认为您实际上最好使用 SQLite 数据库来控制您的代码(并整理结果)。但这是一个更大的变化。