获取TCL中执行代码的行号

时间:2015-01-08 06:20:39

标签: tcl

如何打印执行TCL脚本的行号?

#! /usr/bin/tclsh

set a "100"
set b "200"
set c [expr $a + $b]
puts [info script] ;# it will display the script name which it is executing. 
                    # similarly I need to print the script line number.
puts $c

1 个答案:

答案 0 :(得分:6)

您必须使用info frame才能完成此操作。

info frame ?number?

此命令提供对堆栈中所有帧的访问,即使是从信息级别隐藏的那些帧也是如此。 如果未指定number,则此命令返回一个数字,给出命令的帧级别。如果在顶级调用该命令,则为1。 如果指定了number,则结果是一个字典,其中包含堆栈上编号级别的命令的位置信息。

如果number为正(> 0),那么它选择一个特定的堆栈级别(1指的是最顶层的活动命令,即info frame本身,2指向它被调用的命令,所以上);否则它给出一个相对于当前命令的级别(0表示当前命令,即信息帧本身,-1表示其调用者,依此类推。)

我们将使用info frame命令返回的字典。 其中一个关键是'line',其中包含脚本的行号。

有一个简单的proc

proc printLine {frame_info} {
    # Getting value of the key 'line' from the dictionary 
    # returned by 'info frame'
    set result [dict get [info frame $frame_info]  line] 
}

通常,来自[info frame $frame_info]的结果字典将类似于

type source line 17 file /home/dinesh/stackoverflow/test cmd {printLine [info frame] } proc ::B level 1

由此,我们只是使用dict get

获取键值'line'

只需使用info frame本身可以实现的上下文的当前帧号调用此proc。

即。

set lineNumber [printLine [info frame]]; #Place this line in your code.

此逻辑的演示如下。

<强> printLineNumber.tcl

#!/usr/bin/tclsh
proc printLine {frame_info} {
        # Getting value of the key 'line' from the dictionary 
        # returned by 'info frame'
        set result [dict get [info frame $frame_info]  line]
}
proc D {} {
        puts "proc D"
        puts [ printLine [info frame] ]
}
proc C {} {
        puts "proc C"
        puts [ printLine [info frame] ]
        D
}
proc B {} {
        puts "proc B"
        puts [ printLine [info frame] ]
        C
}
proc A {} {
        puts "proc A"
        puts [ printLine [info frame] ]
        B
}

puts "Global"
puts [ printLine [info frame] ]
A

文档:infodict