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 月,苹果开发者 ...
随机推荐
- MES数据追溯常遇问题及解决方法
MES数据追溯常遇问题及解决方法: 在实际数字化工厂MES应用过程,由于设计或使用不当,数据追溯过程中也可能会存在诸多问题,常遇问题包括:1. 数据质量问题 可能存在数据录入错误.数据缺失或不完整等情 ...
- ElasticSearch之配置
ElasticSearch主要的配置文件,如下: elasticsearch.yml,ElasticSearch的相关参数. jvm.options,JVM的相关参数. log4j2.properti ...
- kafka源码阅读之MacBook Pro M1搭建Kafka2.7版本源码运行环境
原创/朱季谦 最近在阅读Kafka的源码,想可以在阅读过程当中,在代码写一些注释,便决定将源码部署到本地运行. 日常开发过程中,用得比较多一个版本是Kafka2.7版本,故而在MacBook Pro笔 ...
- GDAL从二进制数据流中构造数据集
目录 1. 概述 2. 实现 1. 概述 参看<从二进制数据流中构造GDAL可以读取的图像数据>这篇文章.这个问题的内涵在于,处理图像时都会将其读取成宽X高X波段的三维数组的内存Buffe ...
- Sermant重磅更新,1.3.0 release版本发布
本文分享自华为云社区<新特性速览!Sermant重磅更新,1.3.0 release版本发布>,作者:华为云开源. Sermant社区在12月份正式发布了1.3.0 release版本,这 ...
- 【API进阶之路】因为不会创建云服务器,我被实习生摆了一道
摘要:9个步骤通过API创建云服务器. 事情是这样的,公司成立了一个新项目,要给项目建官网,并搭建一个web服务器.按照我的习惯,搭建一个本地虚拟机就好了,部署简单方便还好配置,云服务器嘛,写了10年 ...
- 华为云GaussDB打造最可信的数据库,给世界一个更优选择
近日,第14届中国数据库技术大会(DTCC2023)在北京国际会议中心顺利举行.大会以"数智赋能 共筑未来"为主题,邀请了上百位行业专家,一起探讨新时代下各类型数据库的最新动态和应 ...
- 深度解析9种ScheduledThreadPoolExecutor的构造方法
摘要:今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码. 本文分享自华为云社区<深度解析ScheduledThreadPoolExecutor类的源代码> ...
- 如何使用参数化查询提高Cypher查询的性能
摘要:在DBMS中,参数化查询被视为一种有效预防SQL注入攻击的手段. 本文分享自华为云社区<使用参数化查询提高Cypher查询的性能:以华为云图引擎GES为例>,作者: 蜉蝣与海. 在D ...
- Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
简介在 Vue 应用程序的开发中,代码压缩.加密和混淆是优化应用程序性能和提高安全性的重要步骤. Vue CLI 是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能.本文将介绍如何使用 ...