大括号后的额外字符
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。
适用于 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。