【问题标题】:How to recall a variable within the "string map" option in tcl如何在 tcl 的“字符串映射”选项中调用变量
【发布时间】:2021-11-04 08:44:50
【问题描述】:

我想依次更新一系列文件,从一个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 等等......

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

【问题讨论】:

  • string map [list WWW $M] $line 所以变量得到评估?
  • 一旦你理解了解决方案,你就会明白 Tcl 中的引用:)

标签: tcl


【解决方案1】:
  1. fileutil 包是 tcllib 的一部分。检查您的变量 auto_path 是否包含 Tcl 可以找到 tcllib 和 fileutil 的路径。

  2. string map 的列表用花括号括起来,因此它对 $M 使用文字美元符号,而不是名为 M 的变量的值。
    将花括号更改为双引号或使用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

【讨论】:

  • 非常感谢,双引号更正成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多