tcl - 来自字符串的来源
问题描述
如何从字符串而不是文件中获取
这就是我们通常获取文件的方式
// 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?
解决方案
该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 中并不经常使用,但对于这样的事情,它是首选命令。
如果将代码放在过程中,则需要更改eval
foruplevel 1
以获得正确的语义;source
不会为您更改堆栈帧:
proc simpleSource {filename} {
set f [open $filename]
set contents [read $f]
close $f
uplevel 1 $contents
}
推荐阅读
- c++ - 使用 priv / public 标头制作库并传递 cv::Mat 的正确方法
- sql - 如何从视图中的表中透视季度数据并以某种方式使其可更新?
- mongodb - 如何使用 mongo 查询打印嵌套数组
- plot - Julia:将函数的参数传递给函数
- c# - 在 C# 中的 WndProc 方法中发送密钥
- python - 如何将字典中的值添加到另一个字典中?
- android-sqlite - Android SQLite 不返回给定搜索词的数据
- sql - 如何在sql中添加两个参数并获取值(将代码pl/sql转换为sql)
- powershell - Powershell 电子邮件添加抄送字段
- r - 复位累计时间