Tcl嵌套proc将输出作为嵌套proc中的输入

时间:2014-12-10 17:31:25

标签: nested tcl proc

proc str2hex { string } {
    set str [binary scan $string H* hex]
    puts $hex
    regsub -all (..) $hex {\1 } t1
    set res [format "%s" $t1 ]
    return $res 


    proc hex2str { $hex } {
        puts "HIIHI"
        foreach c [split $$hex ""] {
            if {![string is xdigit $c]} {
                return "#invalid $$hex"
            }
        }
        set hexa [binary format H* $$hex]
        return $hexa
    }
}

以上是将字符串转换为十六进制的简单代码。我已经进行了嵌套proc,其中将来自“set str [binary scan $string H* hex]”脚本的十六进制作为输入,以便将十六进制重新转换为字符串.Plz帮助我。

1 个答案:

答案 0 :(得分:2)

你通常不应该在Tcl的程序中嵌套程序;它的结果不是你所期待的。目前,Tcl proc命令几乎不会注意调用它的上下文(除了知道当前命名空间是什么),特别是它不会影响“内部”过程对变量的看法。

更重要的是,proc是一个普通命令(碰巧创建了另一个命令),实际上必须调用它才能执行任何操作。将它放在程序中唯一的return之后将保证它根本没有效果。 Tcl非常简单(可预测)。

最后,将$放在变量名中是不明智的。它是合法的,但访问它的语法很笨拙(在你的情况下,它会是${$hex})。


如果你真的想要类似本地程序的东西,可以考虑使用apply和lambda术语。它们是在Tcl 8.5中引入的。

如果您正在使用Tcl 8.6(现在推荐),那么您可以采用更优雅的方式进行这两项操作:

proc str2hex {string {encoding "utf-8"}} {
    binary scan [encoding convertto $encoding $string] cu* bytes
    return [lmap value $bytes {format %02x $value}]
}
proc hex2str {hex {encoding "utf-8"}} {
    return [encoding convertfrom $encoding [binary format H* [join $hex ""]]]
}

(需要指定编码,否则字节之间没有唯一的映射 - binary scanbinary format使用 - 和字符。但我们可以设置合理的默认值。)< / p>