如何强制expr将值作为字符串而不是数字来处理?

时间:2014-09-07 08:28:01

标签: tcl

当TCL获得一个以0作为返回值开头的字符串时,它会将其视为八进制数,并返回八进制数的十进制值。有没有办法绕过它并强制expr将值作为字符串来处理?

我遇到这个问题,因为我有一行:

set val [expr {( $obj == "" ) ? "" : [$obj data]}]

[$obj data]操作的结果之一是以0开头的二进制字符串,expr将其转换为另一个数字。有没有办法解决这个问题,而无需将expr变成if

2 个答案:

答案 0 :(得分:1)

expr命令已定义,如果合法,则将其结果转换为数字。这是这样的,因为......好吧,因为至少Tcl 7.0 并且可能是因为Tcl的第一个版本有一个expr命令(这使得它非常有用)很久以前)。这意味着如果您返回有效的八进制数(09不是),expr 转换它。

如果不希望出现这种情况,请不要将expr用于条件;使用if。在你的情况下,这非常好用(我认为这次使用thenelse伪关键字更清晰。)

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版本?