如何使用proc中的代码查找过程?

时间:2015-09-21 06:29:13

标签: tcl

是否可以使用该程序的内容查找程序名称?

例如,

proc test {args} {
    set varA "exam"
    puts "test program"
}

使用语句set varA,是否可以找到其程序名称测试?

因为,我需要找到一个我知道输出的程序[它打印的东西,我需要找到使用它的程序]。

我尝试了很多方法,例如info framecommand。但是,没有任何帮助。

2 个答案:

答案 0 :(得分:1)

  

是否可以使用该程序的内容找到程序名称?

是。您使用info level 0将参数字添加到当前过程(或info level -1以获取其调用者的参数字)。第一个单词是命令名,在调用者的上下文中解析。这可能就足够了,但如果没有,您可以在namespace which中使用uplevel 1来获取完全限定名称。

proc foo {args} {
    set name [lindex [info level 0] 0]
    set FQname [uplevel 1 [list namespace which $name]]
    # ...
}

请注意,在所有情况下,这都不会为您提供名称。如果您正在使用别名或导入的命令,您将获得的名称会有所不同。大多数情况下并不重要。

答案 1 :(得分:0)

使用info proc,我们可以获得可以帮助您达到预期目标的程序内容。

以下过程将在所有命名空间中搜索给定的单词。您也可以将其更改为在特定命名空间中搜索。此外,如果regexp改为 - nocase,搜索字也可以不区分大小写。它将返回包含搜索词的过程名称列表。

proc getProcNameByContent {searchWord} {
    set resultProcList {}
    set nslist [namespace children ::]; # Getting all Namespaces list
    lappend nslist ::; # Adding 'global scope namespace as well 

    foreach ns $nslist {
        if {$ns eq "::"} {
            set currentScopeProcs [info proc $ns*]
        } else {
            set currentScopeProcs [info proc ${ns}::*]
        }

        foreach myProc $currentScopeProcs  {
            if {[regexp $searchWord [info body $myProc]]} {
                puts "found in $myProc"
                lappend resultProcList $myProc
            }
        }
    }
    return $resultProcList
}

示例

% proc x {} {
        puts hai
}
% proc y {} {
        puts hello
}
% proc z {} {
        puts world
}
% namespace eval dinesh {
        proc test {} {
                puts "world is amazing"
        }
}
%
% getProcNameByContent world
found in ::dinesh::test
found in ::z
::dinesh::test ::z
%