如何在TCL中找到程序(功能)的位置。在位置下我指的是声明它的源文件。
我正在尝试阅读外国源代码,但无法找到单个程序的声明,例如:
set MSISDNElement [regexp -all -inline {ISDN +[0-9]+} $Command]
if { $MSISDNElement != "" } {
foreach elm $MSISDNElement {
set MSISDNValue [list ISDN [getInternationalFormat [lindex $elm 1]]]
}
}
set EptData [list [lindex $Command 1]]
InitEptData 3
foreach Element $EptData {
SetEptData [lindex $Element 0] [lindex $Element 1]
}
功能 InitEptData & SetEptData 我找不到任何声明。有人可以更深入地了解TCL,解释如何解决我所面临的问题吗?提前谢谢!
答案 0 :(得分:9)
对此没有通用的答案,因为Tcl允许您动态声明过程,因此它们可能没有实际的文件引用。
有一些尝试可以改善具有定义文件的过滤器的情况,例如TIP280,在最近的8.5版本中实际可用作info frame
,而TIP 86仅在讨论
但如果简单的grep
不起作用,您可以跟踪创建过程或命令的时刻。
这种情况发生在各个地方(Tcl OO可能会增加一些,不确定):
load
命令期间,当二进制扩展使用Tcl_CreateCommand或更现代的Tcl_CreateObjCommand注册其命令处理函数时。source
命令期间proc
命令本身以定义新过程时使用命令info commands
和namespace children
,您可以遍历整个命名空间树,以获取执行命令之前和之后定义的命令列表。因此,您可以创建一个跟踪任何新命令的包装器。有关如何操作的一些提示,请参阅http://wiki.tcl.tk/1489。
或者,只需使用像RamDebugger http://www.compassis.com/ramdebugger/Intro或ActiveStates商业调试器这样的调试器。
答案 1 :(得分:0)
从bash shell中,我使用:
find . -name "*.tcl" -exec grep -H proc_name_to_find {} \; | grep proc
这会找到所有tcl文件,然后在每个文件上执行grep以搜索proc_name_to_find,然后对于那些包含' proc'
的行再次greped输出由于 grep -H 输出带有输出字符串的文件名,因此显示了在编辑器中查找定义所需的输出。
示例强>:
$ find . -name "*.tcl" -exec grep -H set_prime {} \; | grep proc
./my_lib.tcl:proc prime_test::set_prime {{quiet 0} {no_compare 0}} {
xargs还有其他解决方案......