是否可以使用该程序的内容查找程序名称?
例如,
proc test {args} {
set varA "exam"
puts "test program"
}
使用语句set varA
,是否可以找到其程序名称测试?
因为,我需要找到一个我知道输出的程序[它打印的东西,我需要找到使用它的程序]。
我尝试了很多方法,例如info frame
,command
。但是,没有任何帮助。
答案 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
%