使用TCL/Tk下载网页时内容被当作命令执行报错的问题
问题分析与解决
你的代码报错核心原因是Tcl命令替换语法误用:
- Tcl中,
[命令]会执行方括号内的内容并返回结果,而你写的[$state(body)]会把网页内容($state(body)的变量值)当作命令去执行,网页开头的(define factorial ...不是合法的Tcl命令,因此触发invalid command name错误。
修复后的代码
proc url {String} { package require http package require tls ::http::register https 443 [list ::tls::socket -request 1 -ssl2 0 -ssl3 0 -tls1 1 -cafile VeriSignClass3SecureServerCA-G3.crt] set token [::http::geturl $String] upvar #0 $token state puts $state(body) ;# 移除多余方括号,直接输出字符串内容 }
关键修改点
将puts [$state(body)]改为puts $state(body):
$state(body)本身就是存储网页内容的字符串变量,直接传给puts即可打印内容,无需用方括号做命令替换。
内容的提问来源于stack exchange,提问作者Mark Tarver
相关产品推荐
相关产品推荐

