首页 > 解决方案 > 来自字符串的来源

问题描述

如何从字符串而不是文件中获取

这就是我们通常获取文件的方式

// somename.tcl
proc someName {} {
    # The {} above means a list of zero formal arguments
    puts "Hello from inside someName"
}

我可以通过以下方式从任何其他 tcl 文件中获取它

//main.tcl
source "somename.tcl"

//call someName 
someName

而不是上面的,我想将 somename.tcl 的内容读入一个字符串并获取该字符串。我希望字符串的内容来源于同一进程上下文。

如下所示

//main.tcl 
set filename "somename.tcl" 
set f [open $filename] 
set content [read $f]

# I want to source the content here
#How do i do it?

标签: tcl

解决方案


source命令在内部执行非常类似的操作:

# Reading phase
set f [open $filename]
try {
    fconfigure $f -encoding $encoding -eofchar "\032"
    set contents [read $f]
} finally {
    close $f
}

# Evaluation phase
set oldScript [info script]
try {
    info script $filename
    eval $contents
} finally {
    info script $oldScript
}

where$encoding默认为什么[encoding system]报告。除了它是在 C 语言中完成的,并且对于简单的参数解析有一些额外的复杂性,并且在堆栈跟踪方面有一些不同的错误处理。

在简单的情况下,您可以将其转换为:

set f [open $filename]
set contents [read $f]
close $f
eval $contents

eval命令是这里的关键:它在一个字符串中评估一个 Tcl 脚本。它在现代 Tcl 中并不经常使用,但对于这样的事情,它是首选命令。


如果将代码放在过程中,则需要更改evalforuplevel 1以获得正确的语义;source不会为更改堆栈帧:

proc simpleSource {filename} {
    set f [open $filename]
    set contents [read $f]
    close $f

    uplevel 1 $contents
}

推荐阅读