04 Tcl字符串
Tcl字符串
4.1
Tcl将说有的变量值视作字符串,并将他们作为字符串进行保存。
| 命令 | 描述 |
|---|---|
| append | 将值追加到字符串尾 |
| binary | 二进制化字符串 |
| format | 字符串格式化 |
| regexp | 正则表达式(用于字符串模式匹配) |
| regsub | 用正则表达式进行字符串模式匹配和替换 |
| scan | 字符串分解 |
| string options | 字符串操作和命令集 |
| subst | 字符替代(替代特殊字符) |
4.2 append
将一段字符串连接到另外一字符串形成新的字符串,此命令对变量直接进行修改。
append varName?value?
set var1 Hello
set var2 World
append var1 $var2
=>HelloWorld
puts $var1
=>HelloWorld # var1的内容被更改
4.3 format命令
4.3.1 format命令说明
format命令和C语言中的printf和sprintf命令类似,根据一组格式说明来格式化字符串。此命令不会更改被操作字符串的原有内容
# 使用格式
format spec value1 value2.....
- 例子
set res [format "%2\$s" 1 5 9]
- 上面的format语句要取第二个变元值。
- value1 value2 value3...就相当于一个列表的值--变元
- %--表示格式说明
- 2$--表示取第二个变元--变元的顺序从1开始数
- s--表示字符串
spec
spec包含了格式说明关键词和附加文字,使用%引入一个关键词,后跟0个或者多个修饰符,然后使用一个转换格式符结尾。("%关键词+附加文字+修饰符+格式转换符")
格式转换符
| 字符 | 说明 |
|---|---|
| d | 有符号整数 |
| U | 无符号整数 |
| i | 有符号整数,变元可以是十六进制Ox或者八进制O |
| o | 无符号八进制 |
| x、X | 无符号十六进制 |
| C | 将整数映射到ACSII码表示的字符 |
| s | 字符串 |
| f | 浮点数 |
| e、E | 科学计数法表示的浮点数 |
| g、G | 以%f或%e来表示的浮点数 |
格式标志符
| 标志 | 说明 |
|---|---|
| - | 使字段左对齐 |
| + | 使字段右对齐 |
| space | 在数字前加一个空格,除非数字有带前导符号。 |
| 0 | 用0补充空白 |
| # | 前导O表示八进制,前导Ox表示十六进制数,浮点数中总要带上小数点。不删除末尾的0 |
- 位置说明符i$表示从第i个变元取值而不是根据通常的位置对应关系对应的变元。位置计数从1开始。
4.3.2 format举例
set str [format "%3\$s %1\$s %2\$s" "are" "right" "You"]
=> You are right
format "%x" 20
=>14 # x表示无符号十六进制数
format "%8x" 20
=> 14 # 将20转变为8位十六进制数,右对齐
format "%08x" 20 # 将20转换为十六进制数,8位数据宽度,用0填补
=>00000014
format "%#08x" 20 # 将20进制转变为十六进制数,8位数据宽度,用0填补,添加前导Ox
=>0x000014
set c [format %c%e%c 40 30000 41]
=>(3.000000e+004) # C表示将整数映射为ASCII字符,40和41对应“(”,“)”
set num [scan Aa %C Var1]
=>1 # 将字符串Aa的第一个字符A转换为对应整数
# 并赋值给Var1变量,返回成功转换的个数
puts $Var1
=>65 # 字符A对应的整数
- format格式命令中,“%C”一个整数转换为对应ASCII字符输出,如果一个字符转换为对应的整数,就需要scan命令来完成。
4.4 scan命令
scan命令根据格式描述解析一个字符串,并将对应的值赋值给后面的变量,成功后返回成功转换的个数。
scan string format var1?var?var?var?......
scan的格式描述几乎与format相同,但不用%U。%C的作用与format中的相反,是将一个ASCII字符转换为对应的整数值。
- format是将多个目标转换成一个字符串。
- scan是将一个字符串分解为多个变量。
- scan格式包含有一个集合的概念。它使用方括弧来界定一组字符,这个集合匹配拷贝字符串的一个或多个字符到目的变量中去。这种集合的概念在以后的regexp正则表达式中应用更多。
- 如果scan命令中,没有制定输出变量,则它不返回成功的个数,而返回成功转化的结果。
set num [scan "abcABC" "%C%C" var1 var2]
=>2
puts "$var1 $var2"
=>97 98
set num [scan "abcABC" "%C%C"]
=>97 98
puts $num
=>97 98 # 没有制定输出变量的结果
# 格式描述说明要扫描小写a-z区间的连续字符,用到了花括号表明是一个集合。
scan "abcABC" {%[a-z]} res
=>1
puts $res
=>abc # {} 表示一个字符串 %[a-z] 相当于正则表达式
# {%正则表达式}
scan "ABCabc" {%[A-b]} res
=>1
puts $res
=>ABCab
scan "ABCabc" {%[^a-b]} res # ^是表示非的意思,%2[^a-b] 2个不是a-b
=>1
puts $res
=>ABC
scan "ABCabc" {%2[^a-b]} res
=>1
puts $res
=>AB
4.5 binary命令
Tcl8.0之后支持二进制字符串。
根据数据的存储形式可以分为ASCII形式和二进制形式。
- 按ASCII形式存放的时候,每个字节存放一个ASCII代码,表示一个数字字符。
- 以二进制形式存放,将存储数字的二进制值,比如一个整数10000,用ASCII码表示时,每个数字用一个字节的ASCII码存储,共需要5个字节存储空间。使用二进制存储(将十进制的10000转变为二进制数0010,0111,0001,0000),只需要使用两个字节(一个字节8位)。
- 使用二进制存储要比使用ASCII码存储节省空间。在内存中,都是使用二进制进行存储的。
- binary format就是将数值根据规定的模式对tcl的普通数据进行二进制压缩,而binary scan作用相反,是从二进制数值恢复Tcl普通数据。
# 使用binary format对数值字符串25664进行二进制压缩,使用binary scan进行恢复
# 25664二进制数0110010001000000,需要使用两个字节进行存储
set b [binary format "s" 25664]
=>@d
puts $b
=>@d
binary scan $b "s" var
=>1
puts $var
=>25664
binary scan 1 C var
=>1
puts $var
=>49
- 整数25664以十六进制表示6440H。“s”为格式说明符,按照由低到高字节顺序存储。
- 数值被压缩为两个字节,输出结果为两个压缩字节对应的两个字符。
- @对应的ASCII码为40H,d的ASCII码为64H
- 从数字1恢复数值,字符1的ASCII码=31H,31H对应十进制整数为49。
语法
binary format spec value1?value...?
binary scan spec var1?var2.......?
spec为格式描述字符串
根式描述模板包括类型关键字和数值(type count)两个部分。下表总结了这些类型。表中,类型为跟在类型关键字字母后的可选计数。
| 类型 | 说明 |
|---|---|
| a | 包含count个字符的字符串,在binary format中以空白字符作为补白 |
| A | 和a功能相同,使用空格符而不是空字符作为补白 |
| b | 长度为count的二进制字符串,以0和1组成,按照从低到高的bit位顺序排列 |
| B | 长度为count的二进制字符串,以0和1组成,按照从高到低的bit位顺序排列 |
| h | 长度为count的十六进制字符串,按照从低到高的bit位顺序排列 |
| H | 长度为count的十六进制字符串,按照从低到高的bit位顺序排列 |
| 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 | 使用bianry format放置count个空字节 |
| X | 回退count个字节 |
| @ | 调到由count指定的绝对位置,如果count为*则调到末尾 |
几个小例子:
binary scan "abc" "c" var1
=>1
puts $var1
=>97
binary scan "abcd" "c3" val
=>1
puts $val
=>97 98 99
binary scan "abcd" "ccc" vala valb valc
=>3
puts "$vala $valb $valc"
=>97 98 99
# 将一个8位二进制数(0,1)转换成对应的字符串
binary format B8 01001001
注意:用binary format压缩的字符串,需要在同一系统上用binary scan来恢复。不同系统上的binary字符串可能处理的方式有所不同。
4.6 subst命令
subst命令在字符串中搜索方口号、$和反斜杠,并对其进行替换操作,而对其他数据不做处理。字符串内的花括号对这种替换操作不阻止。
subst {a=$a sum=[expr 1+2]}
=> a=foo bar sum=3
subst {a={$a} sum={[expr 1+2]}}
=>a={foo bar} sum={3} # 数据内部的{}不阻止替换
04 Tcl字符串的更多相关文章
- Linux Shell 04 数字/字符串/文件测试
一. 数字测试 格式:n1 -op n2 测试操作op: eq/ne/le/ge/lt/gt --> 等于/不等于/小于等于/大于等于/小于/大于 1. 数字比较可以使用特殊的( ...
- php基础04:字符串函数
<?php //1.strlen(),strlen() 函数返回字符串的长度,以字符计. echo strlen("hello world"); echo "< ...
- [Java初探04]__字符串(String类)相关
前言 接下来将暂时将重心偏移向实际操作,不在将大量时间花费在详细的知识点整理上,将会简略知识总结笔记的记录,加强实际练习的时间,实例练习篇也不再同步进行,我会将部分我觉得重要的源码更新在每节知识点后面 ...
- Java—字符串小结
最近工作中用到了大量有关字符串截取的知识,在此做出总结,希望需要的朋友带来帮助: 可以复制粘贴代码直接在java中测试1.将字符串中的指定字符":","-"删 ...
- TCL脚本语言基础介绍
Tcl简介(一):Tcl 语法 Tcl 语法 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明.如 ...
- [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库
L1[string]01. ASCII码互转 小知识:字符串处理的几个共同的几点 1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用 2.所 ...
- tcl编程
目录 0. 基础语法 0.1 普通变量 0.2 list, 列表 0.3 array, 数组 0.4 循环 0.4.1 for 0.4.2 foreach 1. 从命令行获取参数(好像并不是很强大) ...
- python学习 数据类型之序列
一.序列(本文使用python3.5)############################################################# 列表.元组 字符窜都是序列#特点:#1 ...
- 【原创】Js:日期处理(日期格式必须【yyyy-mm-dd】才能转成long的毫秒!其他的不是【年-月-日】的格式,结果会是【NaN】)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Swift开发语法
Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...
随机推荐
- python3发送Gratuitous ARP更新vip绑定关系
操作系统 :CentOS 7.6_x64 Python版本:3.9.12 FreeSWITCH版本 :1.10.9 高可用场景下,vip切换完成后需要发送arp广播更新ip和mac地址的绑定关系,如果 ...
- 通用 Mapper 的批量插入实现
具体的 SQL 模板实现如下所示: import org.apache.ibatis.mapping.MappedStatement; import tk.mybatis.mapper.MapperE ...
- 5分钟搞定vue3函数式弹窗
前言 最近接到一个需求,需要在一些敏感操作进行前要求输入账号和密码,然后将输入的账号和密码加到接口请求的header里面.如果每个页面都去手动导入弹窗组件,在点击按钮后弹出弹窗.再拿到弹窗返回的账号密 ...
- 如何在SAP GUI中快速执行新的事务代码
当我们成功登录SAP的某个连接后,在SAP GUI起始页(SAP轻松访问),我们可以通过点击[收藏夹]或者在界面左上角的输入框输入对应的事务代码,直接进入对应事务的界面.但是下面列举的场景,你是否知道 ...
- JavaScript异步编程4——Promise错误处理
目录 1. 概述 2. 详论 3. 参考 1. 概述 在上一篇文章<JavaScript异步编程3--Promise的链式使用>中,通过Promise的链式使用,避免程序中多次嵌套回调(回 ...
- 基于Llama2模型的开源模型
2023年7月18日Meta开源了Llama2,在2万亿个Token上训练,可用于商业和研究,包括从7B到70B模型权重.预训练和微调的代码.相比Llama1,Llama2有较多提升,评估结果如下 ...
- 关于汽车OTA,这篇科普文能告诉你
随着汽车中软件发挥的作用越来越重要,软件定义汽车已经是行业内的共识.汽车行业的发展极有可能最终像手机产业一样,基础硬件差异会越来越小,关键在于汽车给用户的体验的多样性,以及汽车产品在不同场景下满足用户 ...
- 十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略
摘要: 性能调优是应用迁移或开发过程中的关键步骤,同时也在整个项目实施过程中占据很大的份量,本篇主要介绍数据库级别的性能调优思路和总体策略. 性能调优是应用迁移或开发过程中的关键步骤,同时也在整个项目 ...
- 云小课|创建DDS只读节点,轻松应对业务高峰
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:为了扩展主节点的读 ...
- 云图说丨初识数据工坊DWR
摘要:数据工坊DWR是一款近数据处理服务,通过易用的工作流编排和开放生态的数据处理算子,能够在云上实现图像.视频.文档.图片等数据处理业务. 本文分享自华为云社区<[云图说]第236期 初识数据 ...