tcl/tk学习笔记:字符串

本文介绍了Tcl编程中的核心命令,包括append、format、scan等,并详细解释了这些命令的功能与使用方法,还提供了binary命令的具体应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

教材:陈涛.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(Tool Command Language) 本书籍由浅入深系统地介绍了Tcl语言,是学习Tcl语言的良师益友 Tcl编程初步 总目录 总目录 I 例索引. IV 表索引.VI 图索引VII 第 1 章. TCL基本知识 1 1.1 什么是 TCL ..1 1.2 TCL自学工具..1 1.3 TCL软件包 ..2 1.4 TCL命令格式..2 1.5 TCL脚本文件和 SOURCE 命令..3 1.6 可执行脚本文件(EXECUTABLE FILE) .3 1.7 获得帮助..4 1.7.1 Windows系统.4 1.7.2 Unix系统4 第 2 章. 输出、赋值与替换.. 5 2.1 PUTS .5 2.2 SET & UNSET ..5 2.3 替换6 2.3.1 $.6 2.3.2 [] 6 2.3.3 " " 和{} .6 2.3.4 \.7 第 3 章. 数学表达式与 EXPR命令. 8 3.1 数学和逻辑运算符..8 3.2 数学函数..8 3.3 数学运算举例9 3.4 INCR命令 .9 第 4 章. 字符串.. 10 4.1 基本命令集..10 4.2 APPEND命令.10 4.3 FORMAT命令.10 4.3.1 format 命令说明 10 4.3.2 format 举例.. 11 4.4 SCAN命令.12 4.5 BINARY命令..13 4.6 SUBST命令..14 4.7 STRING 命令 ..15 4.7.1 string 命令列表 15 4.7.2 字符串比较 16 4.7.3 string match字符串匹配.. 16 4.7.4 字符串替换 18 4.7.5 字符类别(class)测试. 18 4.7.6 字符串映射 19 第 5 章. TCL列表操作.. 20 5.1 列表命令集..20 5.2 LIST命令..20 5.3 CONCAT命令21 5.4 LAPPEND命令 ..21 5.5 LLENGTH 命令22 5.6 LINDEX命令22 5.7 LRANGE命令.22 5.8 LINSERT 和 LREPLACE命令..22 5.9 LSEARCH命令23 5.10 LSORT命令.24 5.11 JOIN与 SPLIT命令24 5.12 FOREACH控制结构27 第 6 章. 数组 28 6.1 数组的定义与格式28 6.2 数组变量29 6.3 多维数组29 6.4 数组操作命令.30 6.4.1 array get 命令 30 6.4.2 array names命令. 30 6.4.3 遍历数组 31 6.4.4 用数组定义结构.. 31 第 7 章. 控制结构命令. 32 7.1 IF/ELSE命令32 7.2 FOR命令.33 7.3 WHILE命令.33 7.4 BREAK 与 CONTINUE命令..34 7.5 SWITCH命令..34 7.6 CATCH 命令..35 7.7 ERROR命令36 7.8 RETURN 命令..37 7.9 EXIT命令.37 第 8 章. 过程与作用域. 38 8.1 PROC—过程定义命令..38 8.2 作用域.40 8.2.1 过程的作用域 40 8.2.2 变量的作用域 40 8.3 UPVAR命令42 8.4 RENAME命令 44 8.5 特殊变量45 8.5.1 命令行参数 45 8.5.2 env--环境变量数组 45 8.6 EVAL命令..46 8.7 UPLEVEL命令.48 第 9 章. 正则表达式(REGULAR EXPRESSIONS).. 49 9.1 REGEXP命令 .49 9.2 REGSUB命令..51 9.3 正则表达式的语法52 9.3.1 分支(branch)和原子(atom) 52 9.3.2 基本语法 52 9.3.2.1 匹配字符52 9.3.2.2 限定匹配53 9.3.2.3 方括号表达式与字符集.53 9.3.2.4 匹配分支54 9.3.2.5 量词(Qulifier)..54 9.3.2.6 子模式与匹配报告捕获.55 9.3.2.7 反斜杠引用..56 9.3.2.8 匹配优先级..56 9.3.3 高级正则表达式(AREs).. 57 9.3.3.1 反斜杠换码(escape)序列57 9.3.3.2 归整元素(collating element) ..57 9.3.3.3 等价类(equivalence class) ..58 9.3.3.4 字符类(character class).58 9.3.3.5 非贪婪量词..59 9.3.3.6 约束量词59 9.3.3.7 回退引用59 9.3.3.8 前瞻(lookahead)60 9.3.3.9 换行符敏感的匹配60 9.3.3.10 嵌入式选项60 9.3.3.11 扩展语法.60 9.3.4 语法小结 60 9.3.5 其它支持正则表达式的命令.. 60 第 10 章. 名字空间. 62 10.1 创建名字空间62 10.2 用::限定符来使用变量和过程.62 10.3 名字空间的变量 63 10.4 过程的进口与出口64 10.5 内省(INTROSPECTION) 65 10.6 名字空间命令集 65 第 11 章. 跟踪与调试. 67 11.1 CLOCK命令..67 11.1.1 clock clicks命令 67 11.1.2 clock seconds命令 67 11.1.3 clock format 命令 68 11.1.4 clock scan命令. 70 11.2 INFO 命令71 11.2.1 info level .. 72 11.2.2 info exists . 72 11.3 TRACE命令73 11.3.1 trace variable 73 11.3.2 trace vdelete. 75 11.3.3 trace vinfo 75 第 12 章. 脚本库与软件包 76 12.1 声明和使用软件包76 12.1.1 软件包定位 76 12.1.2 声明软件包命令.. 76 12.1.3 加载软件包命令.. 76 12.1.4 自动加载与软件包索引 77 12.1.5 用链接库提供软件包. 79 12.2 PACKAGE命令集80 12.3 小结80 第 13 章. 文件操作与程序调用.. 81 13.1 文件操作..81 13.1.1 文件 I/O. 81 13.1.2 文件系统信息命令.. 82 13.1.2.1 glob命令..83 13.1.2.2 file命令集..83 13.2 程序调用..85 13.2.1 用 open命令打开一个进程管道. 85 13.2.2 用 exec命令调用程序. 87 13.2.3 pid命令. 88 第 14 章. 套接字与事件驱动编程简介 89 14.1 套接字编程.89 14.1.1 socket 命令.. 89 14.1.1.1 Client端socket命令..89 14.1.1.2 Server端socket命令选项90 14.1.2 用 fconfigure配置套接字. 90 14.1.3 C/S编程举例 90 14.2 事件驱动编程93 14.2.1 after命令. 93 14.2.2 fileevent 命令. 96 14.2.3 vwait 命令 96 14.2.4 fconfigure命令 . 97 14.2.4.1 fconfigure语法.97 14.2.4.2 非阻塞I/O.98 14.2.4.3 缓冲 ..98 参考文献. 100 例索引 例 1-1 输出一段字符串的例子.. 2 例 1-2 source命令的简单例子 3 例 2-1 输出一个词的例子 5 例 2-2 参数定义、赋值与参数值引用 5 例 2-3 嵌套$用做替换操作. 6 例 2-4 命令替换[]的例子 6 例 2-5 {}替换的例子.. 6 例 2-6 \的例子.7 例 2-7 不规范的续行 7 例 3-1 数学运算举例. 9 例 4-1 append命令的简单例子. 10 例 4-2 位置说明符的例子. 11 例 4-3 format命令的简单例子. 11 例 4-4 scan命令的简单例子. 12 例 4-5 体验 binary format 和 binary scan的作用 13 例 4-6 binary命令的简单应用.. 14 例 4-7 subst命令的简单例子. 14 例 4-8 string compare 和 string equal进行字符串比较的例子. 16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值