如何在 tcl 中调用 "string map" 选项中的变量

How to recall a variable within the "string map" option in tcl

我想按顺序更新一系列文件,从 tmp 文件 distTmp.RST 到按顺序 dist1.RST、dist2.RST 等..

对我来说,vmd 文本界面中的 fileutil 包无法正常工作,如下所示:

我的 tcl 代码 (add.tcl):

package require fileutil

set F 20.5
set Ff ""

for {set f 0} {$f < 70} {incr f} {
    set F [expr {$F+1}]
    lappend Ff $F
}

puts $Ff


for {set f 0} {$f < 70} {incr f} {
    set M [lindex $Ff $f]
    set N [expr {$f+1}]
    package require fileutil
    ::fileutil::updateInPlace distTmp.RST {string map {WWW $M}}
    ::fileutil::cat dist$N.RST
}

========

发生的错误是

vmd > source add.tcl
can't find package fileutil
vmd > 

========

此外,当我不使用“fileutil”包时,我的脚本如下:

set F 20.5
set Ff ""

for {set f 0} {$f < 70} {incr f} {
    set F [expr {$F+1}]
    lappend Ff $F
}

puts $Ff


for {set f 0} {$f < 70} {incr f} {

    set M [lindex $Ff $f]
    set N [expr {$f+1}]
    set dat [open "distTmp.RST" r]
    set out [open "dist$N.RST" w]
    while {[gets $dat line] >= 0} {
        set newline [string map {WWW $$M} $line]
        puts $out $newline
    }
}

======

但是,调用字符串中的变量$M出现了问题,我需要的输出文件如下:

(base) [Prathit@master]~/APP/OnlyAPP/AlphaFold2/770_res/Charmm-Gui_Dimer-units/E2-E2_3222212666/charmm-gui-3222212666/amber/RSTfiles_Equil>head -n +4 dist1.RST dist2.RST

=> dist1.RST <==

&rst iat = -1, -1, r2 = $$M, r2a = $$M,

==> dist2.RST <==

&rst iat = -1, -1, r2 = $$M, r2a = $$M,

==========

上面$$M应该依次为21.5,22.5,等等....

请告诉我一个可能的解决方案。

  1. fileutil 包是 tcllib 的一部分。检查您的变量 auto_path 是否包含 Tcl 可以找到 tcllib 和 fileutil 的路径。

  2. 您的 string map 列表在花括号中,因此它使用文字美元符号 $M 而不是名为 M.[=29= 的变量的值] 将卷曲改为双引号或使用 list 命令,如已在评论中回答的那样。

  3. $$M 在 Tcl 中通常不行。你想做双重插值吗?如果是这样,我建议使用 set 和一个参数来检索一个值而不是设置一个值。您可以在 subst 命令中使用 $$,但这不是我的偏好。

set name John
set var_name name
puts $$var_name   -->  $name
puts [set $var_name]  --> John 
puts [set [set var_name]] --> John
puts [subst $$var_name]   --> John