format 字符串格式
scan 字符串分解
binary 二进制字符串操作
string options 字符串操作和命令集
subst 字符替代(替代特殊字符)
regexp 正则表达式(用于字符串模式匹配)
regsub 用正则表达式进行字符串模式匹配和替换
例:set res [format "%2\$s" 1 5 9] 取第二个变元的值5。
format "%o"20; 8进制输出20,结果为24
format "%x" 20; 16进制输出20,结果为14
format "%8x" 20; 16进制输出20,宽8位,右对齐,结果为——————14,“—”表示空格
format "%08x" 20; 16进制输出20,宽8位,右对齐,左补0,结果为00000014
format "%-8x" 20; 16进制输出20,宽8位,左对齐
format "%#x" 20; 16进制输出20,前缀为0x,结果是0x14
format "%#8x" 20;16进制输出20,前缀为0x,结果是0x00000014
format %c%e%c 40 30000 41;结果是(3.000000e+04),40和41的ASCII码为"("和")",%e是科学记数法
4.scan string format var? var? ....
与format相反,scan根据格式描述符来解析一个字符串并将对应值赋给后面的变量,返回成功转换的个数,如果没有指定输出变量则返回成功解析的结果。string是待解析的字符串,第二个是控制解析方式的格式字符串
后面的参数用来存储转换出的值。
例 scan "16 units,24.2% margin" "%d units,%f" a b; 结果是2 ;同时a = 16,b = 24.2
该操作同时扫描string和格式,除了被忽略的空格和制表符及% 字符,格式必须和字符串中的字符一一对应,上个例子中,16对应了%d,units,对应units,
24.2对应%f,格式不匹配的字符解析将失败。
有时候空格、制表符不能被忽略,如格式为%c时,%c是将string中的相应字符转换为整型。
例 scan "a%2" "%c%c%c" a b c;运行结果为3,表示成功转换了3个结果;a b c的值分别是97 37 51。
5.scan的几个常见用途
一是简单地解析字符串,上一小节中第一例这样的例子
二是将ASCII字符转换成对应的整型数字,上小节第二例如是
三是将可能是0开头的数字组成的字符串转换为整型数字
例 proc forceDecimal {x} {
set count [scan $x {%lld %c} n c]
if {$count != 1} {
error "not an interger"
}
return $n
}
set val 0987
expr { [forceDecimal $val + 1]}
运行结果是988,如果没有调用forceDecimal 函数,而是expr {$val + 1};则会报错。%lld支持无限精度,可存储任意大小的整数。
6.binary
对于数值来说,二进制(这里说的二进制是数据在机器中的存储方式,后面所说的八进制等只是表现形式)可能比ASCII码更省存储空间,tcl提供了数字的ASCII码和n进制码的转换:
binary format spec value1 ?value2 ...? 将数值类型转换为ASCII
binary scan string spec var1 ?var2 ...? 与上相反
例 set b [binary format "s" 25664] ; 将整型数25664(在内存中占4位)转换成字符串“25664”(在内中占5位),运行结果是"@d"。
25664的二进制表示是0110,0100,0100,0000,高8位是100,对应ASCII为"d",低8位是64,对应"@"
小写的s是从低位开始排列,所以结果是"@d"。
binary scan "@d" "s" var; 执行后puts $var的结果是25664
这里的格式字符前没有加"%",下面列出二进制转换的格式字符
类型 说明
a 包含 count 个字符的字符串。在 binary format 中以空字符作为补白
A 和 a 功能相同,只不过使用空格符而不是空字符作为补白。
b 长度为 count 的二进制字符串,以 0 和 1 组成,按照从低到高的 bit 位顺序排列
B 长度为 count 的二进制字符串,以 0 和 1 组成,按照从高到低的 bit 位顺序排列
h 长度为 count 的十六进制字符串,按照从低到高的字节顺序组成
H 长度为 count 的十六进制字符串,按照从高到低的字节顺序组成
c 一个 8 位字符编码。binary scan 中会从字符串中将字符转换为对应整数
s 字节顺序为 little-endian 的 16 位整数。count 用于指定重复特性
S 字节顺序为 big-endian 的 16 位整数。count 用于指定重复特性
i 字节顺序为 little-endian 的 32 位整数。count 用于指定重复特性
I 字节顺序为 big-endian 的 32 位整数。count 用于指定重复特性
f 本机格式的单精度浮点数。count 用于指定重复特性
d 本机格式的双精度浮点数。count 用于指定重复特性
x 使用 binary format 放置 count 个空字节。使用 binary scan 跳过 count 个字
节
X 回退 count 个字节
@ 跳到由 count 指定的绝对位置。如果 count 为*则跳到末尾
有些字符在终端居然显示不出来,比如224对应的ASCII字符,通常显示成个这"" !?
7.subst
{}中的$,\,[,]等符是不做替换的,但需要替换的时候也可以用subst实现
set a hello!
subst [{a = $a}] 运行结果是a = hello!
如果改成:subst {[puts {a = $a}]b = $a}; 结果就是a = $a b = hello!;理解是,解析器解析的时候,先将{a = $a}传递给了puts命令,puts命令执行完全后,再
将结果a = $a 和 后面的字符串b = $a 传递给subst,因为解析器不对结果进行第二次解析,所以a = $a这里不进行替换。