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. MES数据追溯常遇问题及解决方法

    MES数据追溯常遇问题及解决方法: 在实际数字化工厂MES应用过程,由于设计或使用不当,数据追溯过程中也可能会存在诸多问题,常遇问题包括:1. 数据质量问题 可能存在数据录入错误.数据缺失或不完整等情 ...

  2. ElasticSearch之配置

    ElasticSearch主要的配置文件,如下: elasticsearch.yml,ElasticSearch的相关参数. jvm.options,JVM的相关参数. log4j2.properti ...

  3. kafka源码阅读之MacBook Pro M1搭建Kafka2.7版本源码运行环境

    原创/朱季谦 最近在阅读Kafka的源码,想可以在阅读过程当中,在代码写一些注释,便决定将源码部署到本地运行. 日常开发过程中,用得比较多一个版本是Kafka2.7版本,故而在MacBook Pro笔 ...

  4. GDAL从二进制数据流中构造数据集

    目录 1. 概述 2. 实现 1. 概述 参看<从二进制数据流中构造GDAL可以读取的图像数据>这篇文章.这个问题的内涵在于,处理图像时都会将其读取成宽X高X波段的三维数组的内存Buffe ...

  5. Sermant重磅更新,1.3.0 release版本发布

    本文分享自华为云社区<新特性速览!Sermant重磅更新,1.3.0 release版本发布>,作者:华为云开源. Sermant社区在12月份正式发布了1.3.0 release版本,这 ...

  6. 【API进阶之路】因为不会创建云服务器,我被实习生摆了一道

    摘要:9个步骤通过API创建云服务器. 事情是这样的,公司成立了一个新项目,要给项目建官网,并搭建一个web服务器.按照我的习惯,搭建一个本地虚拟机就好了,部署简单方便还好配置,云服务器嘛,写了10年 ...

  7. 华为云GaussDB打造最可信的数据库,给世界一个更优选择

    近日,第14届中国数据库技术大会(DTCC2023)在北京国际会议中心顺利举行.大会以"数智赋能 共筑未来"为主题,邀请了上百位行业专家,一起探讨新时代下各类型数据库的最新动态和应 ...

  8. 深度解析9种ScheduledThreadPoolExecutor的构造方法

    摘要:今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码. 本文分享自华为云社区<深度解析ScheduledThreadPoolExecutor类的源代码> ...

  9. 如何使用参数化查询提高Cypher查询的性能

    摘要:在DBMS中,参数化查询被视为一种有效预防SQL注入攻击的手段. 本文分享自华为云社区<使用参数化查询提高Cypher查询的性能:以华为云图引擎GES为例>,作者: 蜉蝣与海. 在D ...

  10. Vue 应用程序性能优化:代码压缩、加密和混淆配置详解

    ​ 简介在 Vue 应用程序的开发中,代码压缩.加密和混淆是优化应用程序性能和提高安全性的重要步骤. Vue CLI 是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能.本文将介绍如何使用 ...