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 月,苹果开发者 ...
随机推荐
- 聊聊流式数据湖Paimon(二)
当前的问题 Apache Paimon 最典型的场景是解决了 CDC (Change Data Capture) 数据的入湖:CDC 数据来自数据库.一般来说,分析需求是不会直接查询数据库的. 容易对 ...
- DBeaver连接国产数据库OceanBase,以及Python连接,解决ModuleNotFoundError: No module named '_jpype'
DBeaver连接OceanBase 参考:https://www.modb.pro/db/365929 用户名的格式为: 数据库用户名@租户名#集群名 Python连接OceanBase 参考:ht ...
- cache操作:clean、invalidate与flush的含义
前言 本文试图搞清楚cache几个操作:clean.invalidate与flush的含义.由于只用过ARM和RISC-V,所以是从ARM和RISC-V的角度来说明. cache line cache ...
- 让 sdk 包静默升级的 SAO 操作,你见过几种?
拓展阅读 让 sdk 包静默升级的 SAO 操作,你见过几种? 业务背景 有时候为业务方提供了基础的 sdk 包,为了保证稳定性,一般都是 release 包. 但是每一次升级都非常痛苦,也不可能写一 ...
- linux文件摘选
显示/var目录下所有以1开头,以一个小写字母结尾,且中间至少出现一位数字(可以由其他字符)的文件或目录. 命令: ls -d /var/1*[0-9]*[a-z] [root@foundation0 ...
- table中td超出内容隐藏,鼠标悬停全部显示(完整版,含js代码)
一.CSS语法: text-overflow:clip | ellipsis 默认值:clip 适用于:所有元素 clip: 当对象内文本溢出时不显示省略标记(...),而是将溢出的部分裁切掉. el ...
- 14、Flutter Card卡片组件
Card是卡片组件块,内容可以由大多数类型的Widget构成,Card具有圆角和阴影,这让它看起来有立 体感. Card实现一个通讯录的卡片 class MyApp2 extends Stateles ...
- 赶在520之前,程序员如何用Python送上最特别的“我爱你”表白
摘要:每到情人节.七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题--怎么给女朋友/老婆一个与众不同的节日惊喜.今天给大家分享一个独特的表白方法--用"我爱你"拼出心爱人的模样! ...
- 火山引擎VeDI助力零售品牌私域运营 实现与会员高效“沟通”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 小程序正在成为零售品牌与会员高效沟通的第二阵地. 过去,零售品牌多依赖电商平台与会员保持互动联系.消费者通过关注[ ...
- Axure 鼠标和键盘交互