当TCL获得一个以0
作为返回值开头的字符串时,它会将其视为八进制数,并返回八进制数的十进制值。有没有办法绕过它并强制expr
将值作为字符串来处理?
我遇到这个问题,因为我有一行:
set val [expr {( $obj == "" ) ? "" : [$obj data]}]
[$obj data]
操作的结果之一是以0开头的二进制字符串,expr
将其转换为另一个数字。有没有办法解决这个问题,而无需将expr
变成if
?
答案 0 :(得分:1)
expr
命令已定义,如果合法,则将其结果转换为数字。这是这样的,因为......好吧,因为至少Tcl 7.0 并且可能是因为Tcl的第一个版本有一个expr
命令(这使得它非常有用)很久以前)。这意味着如果您返回有效的八进制数(09
不是),expr
将转换它。
如果不希望出现这种情况,请不要将expr
用于条件;使用if
。在你的情况下,这非常好用(我认为这次使用then
和else
伪关键字更清晰。)
set val [if {$obj == ""} then {} else {$obj data}]
(在字节码级别,这会产生几乎与原始字节码完全相同的字节码,除了它忽略了对tryCvtToNumeric
操作的调用;那就是你说不想要!)
答案 1 :(得分:0)
[警告:不是答案,而是需要格式化的咒语]
我没有观察到相同的结果
% proc obj {args} {return "09"} ;#specifically using invalid octal value
% set obj obj
obj
% $obj data
09
% set val [expr {($obj == "") ? "" : [$obj data]}]
09
% info patchlevel
8.6.1
您使用的是哪种Tcl版本?