例如:get_abc,生成集合的get_xyz命令,set_pqr接收集合是自定义命令,下面是tcl文件
#Tcl file start
get_abc
get_xyz
set_pqr -object [get_abc]
#Tcl file end现在的要求是,我们需要跳过set_pqr命令,并且这个tcl文件很大并且只读取,我们不能更改它。现在,我们在set_pqr命令回调中添加了这种处理,以跳过处理,但是仍然会对同一行的get_abc命令进行处理,这无论如何都是要丢弃的,在集合转到set_pqr时不需要。另外,我们不能跳过软件中的get_abc,因为它是有效的,可以在其他地方使用。
tcl是否提供跳过set_pqr全行的功能?
发布于 2022-01-20 10:01:48
让Tcl做您想做的事情的唯一方法是不使用标准source加载命令。让我们来编写我们自己的版本:
proc skippingSource {filename} {
set f [open $filename]
set code [read $f]
close $f
# Comment out the offending lines; this is a cheap hack BTW
set code [regsub -all -line {^set_pqr } $code "#set_pqr "]
# Override [info script] until this procedure returns
info script $filename
uplevel 1 $code
}现在我们只需要使用skippingSource而不是source。当然,我们可以直接调用它,这是最简单的方法,或者我们可以代替source
# Keep the original in case we want to put it back
rename source originalSource
rename skippingSource source发布于 2022-01-20 18:31:41
您将set_pqr重新定义为一个什么都不做的proc:
# Back up original set_pqr
rename set_pqr set_pqr_original
# Make new proc that does nothing
proc set_pqr {args} {}现在您可以对文件进行source,并且每个seq_pqr命令将什么都不做(并接受任意数量的参数)。
当您再次需要返回原始命令时:
rename set_pqr_original set_pqr这整件事也可以一蹴而就:
proc source_with_skip {filename "skip_commands {}"} {
foreach command $skip_commands {
rename $command ${command}_original
}
source $filename
foreach command $skip_commands {
rename ${command}_original $command
}
}
% source my_file.tcl set_pqr请注意,如果proc位于与当前命名空间不同的名称空间中,上述内容可能不够。
https://stackoverflow.com/questions/70782252
复制相似问题