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字符串的更多相关文章

  1. Linux Shell 04 数字/字符串/文件测试

    一. 数字测试 格式:n1  -op  n2 测试操作op: eq/ne/le/ge/lt/gt    -->    等于/不等于/小于等于/大于等于/小于/大于 1. 数字比较可以使用特殊的( ...

  2. php基础04:字符串函数

    <?php //1.strlen(),strlen() 函数返回字符串的长度,以字符计. echo strlen("hello world"); echo "< ...

  3. [Java初探04]__字符串(String类)相关

    前言 接下来将暂时将重心偏移向实际操作,不在将大量时间花费在详细的知识点整理上,将会简略知识总结笔记的记录,加强实际练习的时间,实例练习篇也不再同步进行,我会将部分我觉得重要的源码更新在每节知识点后面 ...

  4. Java—字符串小结

    最近工作中用到了大量有关字符串截取的知识,在此做出总结,希望需要的朋友带来帮助:  可以复制粘贴代码直接在java中测试1.将字符串中的指定字符":","-"删 ...

  5. TCL脚本语言基础介绍

    Tcl简介(一):Tcl 语法 Tcl 语法 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明.如 ...

  6. [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库

    L1[string]01. ASCII码互转 小知识:字符串处理的几个共同的几点 1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用 2.所 ...

  7. tcl编程

    目录 0. 基础语法 0.1 普通变量 0.2 list, 列表 0.3 array, 数组 0.4 循环 0.4.1 for 0.4.2 foreach 1. 从命令行获取参数(好像并不是很强大) ...

  8. python学习 数据类型之序列

    一.序列(本文使用python3.5)############################################################# 列表.元组 字符窜都是序列#特点:#1 ...

  9. 【原创】Js:日期处理(日期格式必须【yyyy-mm-dd】才能转成long的毫秒!其他的不是【年-月-日】的格式,结果会是【NaN】)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Swift开发语法

    Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...

随机推荐

  1. 聊聊流式数据湖Paimon(二)

    当前的问题 Apache Paimon 最典型的场景是解决了 CDC (Change Data Capture) 数据的入湖:CDC 数据来自数据库.一般来说,分析需求是不会直接查询数据库的. 容易对 ...

  2. DBeaver连接国产数据库OceanBase,以及Python连接,解决ModuleNotFoundError: No module named '_jpype'

    DBeaver连接OceanBase 参考:https://www.modb.pro/db/365929 用户名的格式为: 数据库用户名@租户名#集群名 Python连接OceanBase 参考:ht ...

  3. cache操作:clean、invalidate与flush的含义

    前言 本文试图搞清楚cache几个操作:clean.invalidate与flush的含义.由于只用过ARM和RISC-V,所以是从ARM和RISC-V的角度来说明. cache line cache ...

  4. 让 sdk 包静默升级的 SAO 操作,你见过几种?

    拓展阅读 让 sdk 包静默升级的 SAO 操作,你见过几种? 业务背景 有时候为业务方提供了基础的 sdk 包,为了保证稳定性,一般都是 release 包. 但是每一次升级都非常痛苦,也不可能写一 ...

  5. linux文件摘选

    显示/var目录下所有以1开头,以一个小写字母结尾,且中间至少出现一位数字(可以由其他字符)的文件或目录. 命令: ls -d /var/1*[0-9]*[a-z] [root@foundation0 ...

  6. table中td超出内容隐藏,鼠标悬停全部显示(完整版,含js代码)

    一.CSS语法: text-overflow:clip | ellipsis 默认值:clip 适用于:所有元素 clip: 当对象内文本溢出时不显示省略标记(...),而是将溢出的部分裁切掉. el ...

  7. 14、Flutter Card卡片组件

    Card是卡片组件块,内容可以由大多数类型的Widget构成,Card具有圆角和阴影,这让它看起来有立 体感. Card实现一个通讯录的卡片 class MyApp2 extends Stateles ...

  8. 赶在520之前,程序员如何用Python送上最特别的“我爱你”表白

    摘要:每到情人节.七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题--怎么给女朋友/老婆一个与众不同的节日惊喜.今天给大家分享一个独特的表白方法--用"我爱你"拼出心爱人的模样! ...

  9. 火山引擎VeDI助力零售品牌私域运营 实现与会员高效“沟通”

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 小程序正在成为零售品牌与会员高效沟通的第二阵地. 过去,零售品牌多依赖电商平台与会员保持互动联系.消费者通过关注[ ...

  10. Axure 鼠标和键盘交互