大括号后的额外字符

extra characters after close-brace

适用于 Linux 的相同代码不适用于 FreeBSD

在Linux

% set timeZone "-4:0"
-4:0
% set timeZone [format "%+03d%02d" {*}[scan $timeZone "%d:%d"]]
-0400
% puts $tcl_version
8.5

在 FreeBSD 上

% set timeZone "-4:0"
-4:0
% set timeZone [format "%+03d%02d" {*}[scan $timeZone "%d:%d"]]
extra characters after close-brace
% puts $tcl_version
8.4

如何在 FreeBSD 和 Linux 上实现此功能?

您将不得不使用 eval,因为列表扩展 ({*}) was implemented in Tcl 8.5。你也许可以使用这样的东西:

set timeZone "-4:0"
set code "format \"%+03d%02d\" [scan $timeZone "%d:%d"]"
# This gives you "format "%+03d%02d" -4 0"
set timeZone [eval $code]

如果您不喜欢转义引号,可以使用大括号(IMO 更简洁):

set code "format {%+03d%02d} [scan $timeZone {%d:%d}]"

或者可以从 wiki 找到更详细的 8.4 解决方案 here