如何在 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,等等....
请告诉我一个可能的解决方案。
fileutil
包是 tcllib 的一部分。检查您的变量 auto_path
是否包含 Tcl 可以找到 tcllib 和 fileutil 的路径。
您的 string map
列表在花括号中,因此它使用文字美元符号 $M
而不是名为 M.[=29= 的变量的值]
将卷曲改为双引号或使用 list
命令,如已在评论中回答的那样。
$$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
我想按顺序更新一系列文件,从 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,等等....
请告诉我一个可能的解决方案。
fileutil
包是 tcllib 的一部分。检查您的变量auto_path
是否包含 Tcl 可以找到 tcllib 和 fileutil 的路径。您的
string map
列表在花括号中,因此它使用文字美元符号$M
而不是名为 M.[=29= 的变量的值] 将卷曲改为双引号或使用list
命令,如已在评论中回答的那样。$$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