有一个代码用一个proc生成文件:
puts $fh "proc generate \{ fileName\} \{"
puts $fh "[info body generateScriptBody]"
puts $fh "\}"
puts $fh "generate"
close $fh
proc generateScriptBody{} {
source something1
source something2
...
}
在这种情况下我应该在proc source
内还是有替代方案?
答案 0 :(得分:2)
我不明白你要做什么,但是proc中的来源是可以接受的。如果您希望将整个proc写入文件,请查看TclX包中的saveprocs
;它有助于简化代码。
以下是使用saveprocs
:
package require Tclx
# Generate a proc from body of one or more files
set body [read_file something1]
append body "\n" [read_file something2]
proc generate {fileName} $body
# Write to file
saveprocs generate.tcl generate
在这种情况下,我取消了所有source
命令,并将内容直接读入proc的主体。
答案 1 :(得分:0)
我刚刚在 proc 中调用 source 时遇到问题,也许对某人有帮助。
我有两个测试文件。这是 sourcetest1.tcl
,它以三种不同的方式获取 sourcetest2.tcl
:
puts "sourcetest1.tcl"
proc mysource_wrong {script} {
source $script
}
proc mysource_right {script} {
uplevel "source sourcetest2.tcl"
}
#source sourcetest2.tcl
#mysource_right sourcetest2.tcl
mysource_wrong sourcetest2.tcl
这是sourcetest2.tcl
:
puts "sourcetest2.tcl"
set l {1 2 3}
puts "outside: $l"
proc doit {} {
global l
puts "doit: $l"
}
doit
直接使用 source
一切正常,使用 mysource_right
,两种情况下的输出都是:
sourcetest1.tcl
sourcetest2.tcl
outside: 1 2 3
doit: 1 2 3
但是,使用 mysource_wrong
,我们得到以下输出:
sourcetest1.tcl
sourcetest2.tcl
outside: 1 2 3
can't read "l": no such variable
while executing
"puts "doit: $l""
(procedure "doit" line 3)
invoked from within
"doit"
(file "sourcetest2.tcl" line 12)
invoked from within
"source $script"
(procedure "mysource_wrong" line 2)
invoked from within
"mysource_wrong sourcetest2.tcl"
(file "sourcetest1.tcl" line 13)
我的解释是 source
中的 proc
将变量 l
放入 proc
的范围内,而不是放入全局范围内。这可以通过在 uplevel
中使用 mysource_right
来避免。