tcl/tk学习笔记:字符串

教材:陈涛.Tcl 编程初步 tcl/tk入门经典(2)

1.几个有用的命令

append              将值追加到字符串尾

format               字符串格式

scan                  字符串分解

binary                二进制字符串操作

string options    字符串操作和命令集

subst                 字符替代(替代特殊字符)

regexp               正则表达式(用于字符串模式匹配)

regsub               用正则表达式进行字符串模式匹配和替换


2.append 变量1 $变量2 将变量2的值追加到变量1的未尾。

3.format

与C 语言中的 printf 和 sprintf 函数的格式功能类似。

format spec value1 value2 ...

spec为格式说明字符串,valuex不变元,每个变元最多有6个关键词:位置说明符、标志、字段宽度、精度、长度和转换符。

格式转换符与C类似,格式标志符:"-"表示左对齐,"+"右对齐,“space”在数字前没有前导符时,加一个空格,"0"用0补空白,前导o为八进制,x为十六进制。

位置说明符i$表示从第i个变元取数值,从1开始。

例: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 ...?  与上相反

spec 为格式描述字符串

例 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这里不进行替换。





你可能感兴趣的:(tcl/tk)