1、Tcl替换操作
1.1 三种替换方式
变量替换$,命令替换[],反斜杠替换\
1.1.1 变量替换$
set a 1;
set b $a;
结果为a=1,b=1
同时,若变量替换碰到非字母、数字下划线就会停止替换
set a 22
set a~ 11
set b $a~
此处结果 22,虽然这里的a值为11,但是在$转换的时候,由于到~就停止了,所以依旧输出的是a的值
set b ${a~}
此处结果为 11,输出的结果为 a~的值,若碰到这种情况,用上{}
1.1.2 命令替换[]
set a [expr 1+2]
将表达式(expr) 1+2的结果给a
file delete {*}[glob *v]
file delete 为tcl自带函数,这里实现的是删除.v文件
1.1.3 反斜杠替换\(代表转义字符)
set a "\$"
将a设置成为 $ 号
2、 tcl的引用
其意义在于阻止解析器对$和分好等特殊字符进行的特殊处理,这些方法称其为引用。包含 / "" {}
2.1 /引用
需要特殊注意的是在 tcl命令过长想利用换行操作的时候可以利用 \ 阻止解析器对换行符进行解析,但是\后千万不能有空格
xxxxx-code-xxxxxx \(手贱加了个空格)
xxxxx-code-xxxxxx
这是错误的
xxxxx-code-xxxxxx \(手不贱,没有加空格,即 \后就是换行符)
xxxxx-code-xxxxxx
这是正确的
2.2 " "引用和{}引用
" "引用为弱引用:他只是去掉单词和命令分隔符在""的内部解释(自己有点不理解)
{ }引用为强引用:在里面的所有字符全部直接输出,即所见即所得
3、三种匹配方式
exact glob 正则表达式
3.1 exact 匹配
严格匹配,完全一样才可以匹配
"hello world"——————"hello world" 利用exact命令只有这样才能匹配
"hello*"———"hello world" 利用exact命令这样就匹配不了
3.2 glob 匹配
符号 |
意义 |
? |
匹配任意单个字符 |
* |
匹配无现场的任意字符,包括空字符串 |
[char] |
匹配chars中给出的任意字符,其中可以使用A-Z这样的形式 |
\x |
匹配单个字符x,可以用于指定会被特殊处理的字符,如*?[]\ |
3.3 正则表达式匹配
符号 |
意义 |
. |
匹配任意字符 |
^ |
匹配开头 |
$ |
匹配结尾 |
\x |
匹配字符x,如*匹配星号 |
[chars] |
匹配包含chars中任意字符 |
[^chars] |
匹配除chars的字符 |
(regexp) |
将括号里面的regexp作为一个匹配项进行匹配,如(abc)就匹配abc |
* |
对前面项匹配0次以上 |
+ |
对前面项匹配1次以上 |
+ |
对?前面的项匹配0次或者一次,如(abc)?匹配带有0个或者1个abc的字符串 |
regexp1|regexp2 |
匹配regexp1和regexp2的任意一项,如a|b匹配a或者b |
4、变量
需要注意的点 |
1.tcl中变量无需定义,用set创建,unset移除 |
2.用 $ 进行调用 |
3.区分大小写 |
4.建议用数字、字母、下划线;同时开头用字母 |
5.常用变量类型: string ; list ; directionary 新思还有专门的collection |
6.变量存储类型:字符串表达形式;内部表达形式(整数,实数,名称,列表,tcl脚本) |
4.1 string 命令
string命令1 |
结果 |
注释 |
string match ?-nocase? Pattern string |
*** |
string匹配命令 |
string match i ICXiaoMiDi2020 |
1 |
|
string match {*[0-9]} |
1 |
这里必须用上{}表示他们是一个整体 |
string match -nocase {[a-z]*[0-9]} |
1 |
这里的nocase表示不区分大小写 |
string命令2 |
结果 |
注释 |
string equal ?-nocase? ?-length int? string1 string2 |
*** |
string equal命令,严格相等返回1,否则返回0 |
string equal -nocase -length 3 Myi456afsd myifasdfa54 |
1 |
不区分大小写,看前三个字符是否严格相等 |
string命令3 |
结果 |
注释 |
string compare ?-nocase? ?-length int? string1 string2 |
*** |
string 比较命令,严格相同返回0,不同处string1先于string2 返回-1,反之返回1 |
string compare Tyz2021 Tyz2021 |
0 |
严格相等 |
string compare Tyz2020 Tyz2021 |
-1 |
2020先于2021 |
string compare Tyz2021 Tyz2020 |
1 |
2020后于2021 |
string命令4 |
结果 |
注释 |
string length string0 |
*** |
计算字符串长度 |
string length 123456 |
6 |
计算长度 |
string命令5 |
结果 |
注释 |
string index string0 charIndex |
*** |
返回string中第charIndex个字符 |
string index TyzBlog 2 |
z |
索引从0开始,输出字符串中第2个字符 |
string命令6 |
结果 |
注释 |
string range string first last |
*** |
返回字符串中一个区间的字符 |
string range TyzBlog 0 2 |
Tyz |
输出索引0到2之间的字符 |
string命令7 |
结果 |
注释 |
string replace first last ?newstring? |
*** |
用newstring替换两个索引之间的字符 |
string replace TyzNice end-3 end Good |
TyzGood |
用good替换nice |
string命令8 |
结果 |
注释 |
string map ?-nocase? mapping string |
*** |
将mapping中的映射关系应用到string中,字字符串中 |
string map {T t 20 21 25 26} Tyz202025 |
tyz212126 |
按照对应关系进行替换 |
string命令9 |
结果 |
注释 |
string trim string ?chars? |
*** |
从两侧对chars包含的字符进行裁剪 |
string trim icgoodcoolTyz icz |
goodcoolTy |
对两侧的icz的字符进行裁剪 |
string命令10 |
结果 |
注释 |
string trimleft string ?chars? |
*** |
从开头对chars包含的字符进行裁剪 |
string trimleft icgoodcoolTyz icz |
goodcoolTyz |
对开头的icz的字符进行裁剪 |
string命令11 |
结果 |
注释 |
string trimright string ?chars? |
*** |
从结尾对chars包含的字符进行裁剪 |
string trimright icgoodcoolTyz icz |
icgoodcoolTy |
对结尾的icz的字符进行裁剪 |
tips:这几个裁剪命令主要用于删除字符中的空格,很有帮助 |
|
|
string命令12 |
结果 |
注释 |
string tolower string ?first? ?last? |
*** |
将范围内字符转成小写 |
string tolupper string ?first? ?last? |
*** |
将范围内字符转成大写 |
string命令13 |
结果 |
注释 |
string repeat string count |
*** |
重复string count次 |
|
|
|
string命令14 |
结果 |
注释 |
string reverse string |
*** |
字符调转 |
|
|
|
4.2、 变量值list
创建list的三种方法
1、 set list_a "fio0 fio1 fio2"
2、 set list_a {fio0 fio1 fio2}
3、 set list_a [list fio0 fio1 fio2] 注意这里的list不是元素,[]整个是一个[]替换
list命令1 |
注释 |
llength list |
返回列表长度 |
|
|
list命令2 |
注释 |
lindex list count |
访问列表元素 |
|
|
list命令3 |
注释 |
linsert list 1 ?value? |
在列表中相应位置插入值 |
|
|
list命令4 |
注释 |
lreplace list first last ?value value...? |
在范围内替换 |
|
|
list命令5 |
注释 |
concat ?list list? |
列表拼接 |
|
|
list命令6 |
注释 |
lappend list value |
列表元素添加,注意这里没有$号 |
|
|
list命令7 |
注释 |
lrepeat number value ?value? |
重复number次value |
|
|
list命令8 |
注释 |
lassign list varName ?value? |
依次将列表中的值取出并进行赋值给value |
|
|
list命令9 |
注释 |
join list ?joinstring? |
将joinstring作为分隔符,将列表元素串联起来,通常用于将list 转化为 string |
|
|
list命令10 |
注释 |
split string ?splitChars? |
将string 用splitChars进行分隔开来 |
|
|
list命令11 |
注释 |
lsearch ?option ...? list pattern |
**搜索列表中的元素 ** |
4.2、 变量值array
暂未仔细研究
5、表达式
5.1 expr 命令
6、流控制
5.1 流控制 if
这里需要注意的是,大括号左需要和条件在一行,否则解析器看到换行符就以为结束了,会造成错误
此外需要注意的是 大括号和if elseif之间一定要有空格,因为解析器是以空格来解析的
5.2 流控制 while
5.3 流控制 foreach
5.4 流控制 switch