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. 3D组合地图在数据可视化大屏中的应用

    前言 当下数据可视化大屏展示的花样层出不穷,可视化大屏的C位越来越卷,地图的样式已经不再止步于普通的平面地图,在虚拟环境中探索和交互,今天我们要介绍的这一款3D组合地图可以将复杂的数据以直观的方式呈现 ...

  2. pytest框架学习-前置和后置setup和teardown

    前置和后置 (1)setup和teardown,方法级 写在类中 方法级,每个用例都会执行setup和teardown. 相当于setup_method和teardown_method (2)setu ...

  3. Ubuntu图形界面root登录“sorry, that didn't work please

    https://blog.51cto.com/u_14757092/2484490 ssh登录主机执行下vim /etc/pam.d/gdm-autologin 注释行 "auth requ ...

  4. PyTorch项目源码学习(3)——Module类初步学习

    torch.nn.Module Module类是用户使用torch来自定义网络模型的基础,Module的设计要求包括低耦合性,高模块化等等.一般来说,计算图上所有的子图都可以是Module的子类,包括 ...

  5. C++篇:第十四章_编程_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十四.编程 (一)概念 系统函数及其库是 C++语言所必须的,预处理命令不是 C ...

  6. 云图说 | 容器交付流水线ContainerOps,助力企业容器化转型

    摘要:华为云容器镜像服务SWR推出容器交付流水线(ContainerOps)可以帮助企业容器化转型. 容器交付流水线(ContainerOps)是华为云容器镜像服务(SWR)推出的面向从源代码到生产上 ...

  7. 云原生2.0时代,华为云DevOps立体运维实践

    摘要:随着云原生2.0时代的来临,越来越多的企业及个人选择使用云原生技术来构建业务,云原生技术给业务构建.交付带了便利的同时,对运维也提出了更高的要求. 2020年12月,中国DevOps社区峰会在北 ...

  8. 快来,这里有23种设计模式的Go语言实现

    摘要:设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. 本文分享自华 ...

  9. 面对 Log4j2 漏洞,安全人都做了什么?

    摘要:本文从漏洞复现.漏洞防护.漏洞检测.软件供应链安全等方面,介绍安全人针对该漏洞做的尝试. 本文分享自华为云社区<面对 Log4j2 漏洞,安全人都做了什么?>,作者:maijun. ...

  10. 火山引擎数智平台 VeDI 帮助智能投影仪更懂用户需求

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当露营成为年轻人的一种全新生活方式后,连带着户外野营帐篷.可折叠桌椅.卡式炉.多人趣味桌游等露营周边市场都迎来新一 ...