TCL编程

这里写目录标题

  • 语法
    • 赋值(或者说替换)
      • $
      • []
      • \
    • 引用
      • \和“”、{}
  • 匹配
    • exact、glob
    • 正则表达式
  • 变量
    • 简介
    • string
      • 语法、match选项
      • equal、compare
      • length、index、range
      • replace、map
      • trim(裁剪)
      • 大小写转换
      • repeat、reverse
    • list
      • 创建
      • 语法
      • llength、index、lrange
      • linsert、lreplace、lset(插入、替换)
      • lconcat、lappend、lrepeat、lassign(合并、追加元素、重复、将list_a的内容依次取出来赋值)
      • 添加/修改分隔符
      • lserch
    • Array(数组)
  • 表达式
    • 简介
  • 流控制
    • if
    • while
    • foreach
    • switch
    • break/continue
  • 函数
    • 基本结构
    • 其他三种写法
    • 补充(参考)
  • 文件
    • 文件读写
    • 文件操作
  • 常用命令

语法

赋值(或者说替换)

$

在这里插入图片描述
set 变量名 值
其中,值可以是常量,如上图的12,也可以是从变量中拿到的值,如上图中的$a

注意,如果变量名不是由字母数字和下划线组成的,那么在$时,要将变量名加上花括号

[]

在这里插入图片描述
expr是计算表达式的值,
语法:
expr 1+2
expr $a + $b

[]是返回命令执行的结果,多用于赋值和条件判断

补充:如果使用[glob *v]本意是想拿到所有以v结尾的文件,但是虽然他确实返回结果是a.v b.v c.v,但是他将这三个.v合并成了一个变量进行返回,当前目录并没有名为“a.v b.v c.v”的单个文件,所以,这里想要返回三个变量,需要在前面加{星}
这一点类似于shell里面的$星 和 $@

\

在这里插入图片描述
\是转义字符,将一些特殊字符当成字面量输出

引用

\和“”、{}

在这里插入图片描述
引用:在tcl中的引用,表示的是可以阻止解释器对一些特殊字符(即在tcl中视为命令的字符,将其按照字符串输出其字面量,也就是直接输出他自己,不让其执行命令功能)

1、反斜杠:
第一,他可以进行转义,将一些特殊功能的字符,当成字符输出
第二,当我们写命令时,一行写不下的话,可以在后面加上 +\,之后换行写后续的命令,这表示下一行的命令跟上一行是同一行命令(需要注意的是,\后面不能有空格)

2、强引用与弱引用:
弱引用:使用双引号引起来,里面可以进行特殊字符的使用
强引用:只要是被强引用引起来的,都要被视为字符串,进行输出,特殊字符丧失功能变为普通字符

匹配

exact、glob

在这里插入图片描述
exact是严格匹配,即两边内容必须严格一致,才会匹配的上
而glob则是模糊匹配,可以使用一些通配符进行模糊匹配,如上图的表格,(注意,这些通配符是glob自带的,不是正则表达式,可以会有一些与正则表达式有不同的含义)

正则表达式

在这里插入图片描述
更多的正则表达式可以去以下网站:
在这里插入图片描述

变量

简介

在这里插入图片描述

string

语法、match选项

在这里插入图片描述
语法:string 【option】 参数1 参数2 参数3 … 参数n

match:
string match 参数1(glob通配符形式) 参数2(字符串)
该语法的意思就是,将参数1和参数2进行匹配,其中参数1是通配符,如果匹配上了,则返回1,否则0

而用两个问号括起来的-nocase,表示可选项。如果加上了nocase,则表示不区分大小写

equal、compare

在这里插入图片描述
string equal string1 string2
用于比较两个字符串是否相同,且这种比较是严格比较,必须完全相同,当然可以选择加上可选项:-nocase
以及-length x 选项,这个选项表示比较前x位字符

string compare string1 string2
这个参数也是严格比较,但是注意与equal的返回值有所不同,首先他相同的话返回0,不同的话他会根据不同的那个字符的字典序返回1或者-1
当然,他也可以选择可选项

length、index、range

在这里插入图片描述
length:string length string1
返回字符串的长度,字符串如果有空格、转义字符(算一个字符),可以使用双引号包起来

index:string index string1 charindex
返回字符串的索引字符,索引从0开始,且charindex有三种表示方法,如上图
(注意:end表示最后一个元素,end-x,表示不算最后一个元素,倒数第x个元素)

range:string range first last
返回字符串的一个区间
(first如果小于0,则按0处理)

replace、map

在这里插入图片描述
replace:如上图,可以将某个区间的字符串进行替换,如果不指定替换的新字符,则意味着进行删除操作

map,设置key-value,将字符串中的key替换为value

trim(裁剪)

在这里插入图片描述
裁剪:

tcl里面的裁剪很有意思:
格式:string trim string1 字符组合

从string1的两边开始,需要字符组合中的任意一个字符,就会将其裁掉,知道遇到没有出现在字符组合中的字符,就会停止

而trimleft、trimright,分别表示从左边开始和从右边开始

大小写转换

在这里插入图片描述

repeat、reverse

在这里插入图片描述

list

创建

在这里插入图片描述

语法

列表与string不同的是,他的选项在最前面,且列表名大部分需要在前面加$
语法:
【option】 $list 参数1 参数2 参数3… 参数n

llength、index、lrange

在这里插入图片描述
检索时,元素下标从0开始

linsert、lreplace、lset(插入、替换)

在这里插入图片描述
注意:向list 插入时,要对list变量进行$取值,才能插入,而对列表某个位置进行替换时,则不需要对列表名进行 $,如上图的lset
(set a {a b c d}是创建a列表,列表元素是a、b、c、d,这是创建列表的一种方式之一)
但是对某个区间进行替换时,仍然恢复成需要加 $

区间替换时,如果不加新的替换内容,则是删除操作(注意只能是区间替换)

lconcat、lappend、lrepeat、lassign(合并、追加元素、重复、将list_a的内容依次取出来赋值)

在这里插入图片描述
lappend追加时,也不需要$

而lrepeat重复时,结构有所变化,参数与$list 交换了位置

添加/修改分隔符

在这里插入图片描述
用问号括起来的是我们要设定的新的分隔符,如果分隔符不止一个字符,如上图第一个用紫线画出来的,就要用双引号引起来。
使用join命令可以修改新的分隔符,同时实现了list–>string的转换

使用split命令可以将分隔符删去,同时实现了string–>list的转换

lserch

在这里插入图片描述
在终端敲入man lsearch,可以看到详细介绍

lsearch使用时,会有许多自己的选项,这些选项如果需要添加,则加在lsearch后面。
常见的选项有,控制匹配方式,控制返回元素还是元素索引,控制返回第一个匹配到的元素还是所有匹配到的元素

Array(数组)

在这里插入图片描述
上图中的,
set color(red) 1
set color(green) 2
set color(blue) 3

实际上就是在创建一个名为color的数组,该数组实际上是键值对集合,即输出color(red)会得到1,输出color(green),会得到2

array names color:拿到所有的键

array get color:拿到所有的键值对

array size color:拿到数组的大小

表达式

简介

在这里插入图片描述
想要计算出表达式的值,要使用expr,且计算时如果不是常量,都进行$进行取值,而如果想要将计算结果赋值给一个变量,则要在最外层加上[]

注意,上图右边那个表中列出了运算符对应的操作数的类型,如上图,%运算符只能操作int,不能操作double

流控制

if

在这里插入图片描述
注意点:
1、如果逻辑表达式作为条件,则表达式前面不需要加expr
2、if 和 { 要在一行,包括elseif 和 {也要写在一行
3、各部分之前要有空格分隔

其中第二个if在}的左边少了一个] ,由此可以看到,对于条件判断,想要拿到某些命令的值,需要在外面加[],且对于条件判断来说,逻辑表达式不需要expr
但是对于计算表达式,还是加上expr为好,同时需要[]来得到计算结果,例如if {[expr $a + $b] > 3} {

while

在这里插入图片描述

foreach

在这里插入图片描述
增强for循环,
第一种用法,就是上图最上面的用法,很常见,实际上就是增强for

其他用法:
如上图下面的用法,有i j 依次取列表中的元素,也有i j 各自取各自的列表,然后依次输出自己列表的元素

switch

在这里插入图片描述
switch的基础语法:
switch $待匹配变量 {
选项1 {执行语句}
选项2 {执行语句}
}

而switch有几个option可选,默认情况下,他是exact匹配,也就是严格完全匹配
加了-glob,就可以实现模糊匹配
加了-regexp,则表示进行正则表达式的匹配

补充:
1、incr x,表示将x进行+1
2、正则表达式中,执行-,表示执行下一个选项的函数体

break/continue

在这里插入图片描述

函数

基本结构

在这里插入图片描述
proc是函数定义命令,
而函数体内的global,表示声明变量,有了该语句,才可以在函数体内调用a变量

其他三种写法

在这里插入图片描述
第一种:加一个参数,用于选择使用加法还是乘法
第二种:默认参数,{参数 默认值},注意,此时默认参数必须在最后一个
第三种:参数最后面加上args,可以实现可变参数

补充(参考)

在这里插入图片描述
可以通过上图这种方式,从而为我们自己的函数设置help文档,到时候可以使用函数名 -help,来查看我们写的帮助文档

在这里插入图片描述
在写上上图代码之前,要写上图最上面那条语句,即,先将command group定义出来,可以使用list_command来验证是否创建成功

最后source生效一下,可以使用help 查看某个comman group中包含的函数

文件

文件读写

在这里插入图片描述
打开文件有许多的权限,如上图右上角的表,查阅即可

set handle [open 路径 打开方式]
该句的意思是,将[ ]中命令的执行结果或者返回值拿到,然后赋值给handle,此处可以认为拿到了句柄(文件套接字)

而上图框出来的代码逻辑是:
循环判断是否到了文件末尾,如果没有,则进入循环,
读到文件的一行,给到变量line
判断该行是否可以模糊匹配VIOLATED,如果可以,输出该行(line变量的内容)到写文件(write_handle)内

文件操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常用命令

在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值