【问题标题】:How to variable substitution when reading a file in Tcl在 Tcl 中读取文件时如何进行变量替换
【发布时间】:2022-11-17 18:58:42
【问题描述】:

这是我的文件名文本,它包含以下内容

system
 {
host name $HOSTNAME
value 25

as 635
}

我正在写下面的代码来读取文件:

set HOSTNAME "NEw york"
set cf [open text r]
foreach line [split [read $cf] \n] {
puts $line
close $cf

当我对 HOSTNAME 执行 puts $line 变量替换时,没有完成,该怎么做??

【问题讨论】:

    标签: tcl


    【解决方案1】:

    使用 subst 命令: https://www.tcl.tk/man/tcl8.4/TclCmd/subst.html

    set HOSTNAME "New York"
    set line {host name $HOSTNAME}
    
    puts $line 
      --> "host name $HOSTNAME"
    puts [subst $line]
      --> "host name New York"
    

    【讨论】:

    • subst -nocommands $line。要查看原因,请将 [error] 放入您的文件数据中,然后看到它在计算 tcl 命令时发出错误。现在考虑该文件可能包含[exec rm -rf /]
    • 在 8.7 中,您将能够使用 regsub -command 来更好地完成它,因为您将能够控制替换哪些变量以及用什么替换。 (典型的例子包括对白名单的限制或只允许用户的环境变量。)仅通过准备输入subst 来做这类事情很难做到正确。
    • 谢谢大家。一切顺利
    【解决方案2】:

    如果你只要想要支持替换 $HOSTNAME 而不是别的,使用 string map

    set HOSTNAME "NEw york"
    set mapping [list "$HOSTNAME" $HOSTNAME]
    set cf [open text r]
    foreach line [split [read $cf] 
    ] {
        puts [string map $hostname $line]
    }
    close $cf
    

    string map 命令对于执行任何固定的替换集来说非常好。虽然我知道它的实现在内部非常愚蠢,但它具有极好的缓存一致性,并且正是 CPU 制造商喜欢优化的那种东西。

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2018-01-15
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多