我正在将2个文件存入我的TCL脚本。两者都有一些名称相同但值不同的变量。我要使用这两个文件,我无法修改它们。我怎样才能克服这个问题..?
答案 0 :(得分:1)
立即想到的两个想法是尝试命名空间或解释器。
在这种情况下,我们只是在做:
namespace eval A {
source script-a.tcl
}
namespace eval B {
source script-b.tcl
}
不能保证这些不会发生冲突 - 它们并没有强烈分离 - 但它们可能会起作用。这绝对是一件容易尝试的事情,创建的变量和程序应该分开。
这个方法肯定会将脚本彼此隔离开来,但是处理起来可能会更加尴尬,因为它还会将它们与应用程序的其余部分隔离开来(除非你提供适当的交叉间隔别名) :
interp create Acontext
interp eval Acontext {
source script-a.tcl
}
interp create Bcontext
interp eval Bcontext {
source script-b.tcl
}
正如我上面提到的,默认情况下,这不会让脚本看到主脚本完成的任何操作;隔离墙几乎是完全的。要授予对主解释器中命令的访问权限,您需要创建别名:
proc mainContextOperation {callee args} {
puts "this is in the main context called from ${callee}: $args"
}
interp alias Acontext DoMyThing {} mainContextOperation Acontext
interp alias Bcontext DoMyThing {} mainContextOperation Bcontext
在执行source
调用之前(但在interp create
调用之后)创建这些别名,并且这些脚本将能够使用DoMyThing
命令在主要背景将非常清楚发生了什么。
Tcl使用这种机制作为安全解释器的基础,这就是你如何评估不受信任的Tcl代码而不会暴露很多导致恶作剧的能力。