0. 基础语法

0.1 普通变量

#变量赋值
set x "This is a string"
set y 1.24 #打印变量
puts $x
puts $y

0.2 list, 列表

#列表赋值
set la [list 'a' 'b' {'c' 'd'}] #llength: 获取list长度
puts [llength $la] ; # 3 #lindex: 根据idx获取元素
set e2 [lindex $la 2]
puts $e2 ; # 'c' 'd' #lsearch: 在list中查找指定元素
lsearch $la 'b'; # 1, 返回'b'的idx. #lappend: 追加元素, 可以追加多个
lappend la 'ef' 'gh'; # 注意会修改la本身
puts $la; # 'a' 'b' {'c' 'd'} 'ef' 'gh' #linsert: 在指定位置插入元素, 可以插入多个
set la_new [linsert $la 1 'x' 'y' 'z']
puts $la_new ; # 'a' 'x' 'y' 'z' 'b' {'c' 'd'} #lrange: 返回first~last的元素 #lreplace: 替换first~last的元素 #lsort: list排序 #concat: 多个list合并为一个list
set la [list 'a' 'b']
set lb [list 'x' 'y']
set lc [concat la lb]
puts $lc ; # 'a' 'b' 'x' 'y'

0.3 array, 数组

array set arr {} ; # 创建空array, 清空已有array
array set arr {a 1 b 2 c 3 de 4} ; #
puts [array size arr] ; # array长度, key-val对的数目

0.4 循环

0.4.1 for

set la [list 'a' 'b' 'c' 'd' 'e']
for {set i 0} {$i<[llength $la]} {incr i} {
puts "$i: la[$i]"
}

0.4.2 foreach

#待循环的list
set la [list 'a' 'b' 'c' 'd' 'e']
set lb [list '1' '2' '3' '4' '5' '6'] # 循环单个list, 每次取一个元素
foreach ele $la {
puts "$ele"
} # 循环单个list, 每次取多个元素
foreach {ele0 ele1} $la {
puts "$ele0, $ele1"
} # 循环多个list, 循环次数以最长的list为准, 不足的补空元素
foreach ea $la eb $lb {
puts "$ea: $eb"
}

1. 从命令行获取参数(好像并不是很强大)

array set a0 $argv
foreach opt {-i -o} {
puts "$opt -> $a0($opt)"
}

运行

$ ex.tcl -i abc -o xyz
-i -> abc
-o -> xyz

2. 给proc定义参数(部分命令只在dc或pt中有效)

proc display {args} {
parse_proc_arguments -args $args my_arg
return [expr $my_arg(-a) + $my_arg(-b)]
} define_proc_attribute display -info "process two number" -define_args {
{-a "the 1st number" a string required}
{-b "the 2nd number" b string required}
} display -a 5 -b 6

3. 按行读入文件

set FH [open ../rpt/$file r]
while {[gets $FH line] >= 0} {
puts $line
}
close $FH

4. 正则匹配

if [regexp {^(\w+)} $line all_match match1] {
puts $match1
}

5. catch

当运行的命令出现错误时, catch语句返回1

if [catch {open file.txt r} FH] {
puts "Error: file.txt not opened"
} else {
puts "open file.txt"
while {[gets $FH line] >= 0} {
puts $line
}
}

6. 非整数运算

set a [expr 100 * double(1)/3] # 返回33.333333333333336%
# 如果不使用double, 则只会返回整数部分
# [expr 100 * 1/3] 返回33
# [expr 1/3 * 100] 返回0
puts "$a%" # 33.333333333333336% set b [format "%.2f" $a]
puts "$b%" # 33.33%

7. 四舍五入, 伪随机数

# 四舍五入
set a 2.3
set b [expr round($a)] #注意, 要通过expr调用, 调用时后面要加圆括号
puts $b # 2, 四舍五入2.3变为2 # 生成0~1之间的伪随机小数
set c [expr rand()] # 注意, 要通过expr调用.
puts $c # 0.45033995969519 # 生成0~9之间的伪随机整数
set d [expr round(9*rand())]
puts $d # 5

8. eval和exec

# eval 动态执行tcl语句
set cmd "puts 123"
eval $cmd # 123 # exec 执行unix shell命令(或windows cmd命令)
set a [exec find . -name "run*"]
puts $a # 打印出find命令的标准输出

9. 进制转换

binary用于操作二进制字符串.

包含四个子命令:

binary format: 将普通tcl字符串转换为二进制字符串.
binary scan : 将二进制字符串转为普通tcl字符串.
binary encode: 将二进制字符串进行编码.
binary decode: 将编码后的二进制字符串进行解码.
# 普通tcl字符串, 内容是16进制的字符
set hex_str FF00CC # 将普通tcl字符串$hex转为二进制格式,
# H : 表示待处理的字符串中是16进制字符
# * : 表示待处理的字符串list长度任意??
set bin_fmt [binary format H* $hex_str] # 将二进制数据($bin_fmt)转为普通tcl字符串, 存储到变量$bits中
binary scan $bin_fmt B* bits # 打印$bits
puts $bits ;# 1111111110000000011001100 # 将$bits格式化为特定长度的str, %0*s, 中的*, 表示通过变量指定长度
set width 28
set bits_28 [format "%0*s" $width, $bits]
puts $bits_28 ; 00001111111110000000011001100 #遍历$bits_28
set len [string length $bits_28]
for {set i 0} {$i<=[expr $len-1]} {incr i} {
set i_str [expr $len-1-$i]
puts "$i -> [string index $bits_28 $i_str]"
} # 0 -> 0
# 1 -> 0
# 2 -> 1
# 3 -> 1
# 4 -> 0
# 5 -> 0
# 6 -> 1
# 7 -> 1
# 8 -> 0
# 9 -> 0
# 10 -> 0
# 11 -> 0
# 12 -> 0
# 13 -> 0
# 14 -> 0
# 15 -> 0
# 16 -> 1
# 17 -> 1
# 18 -> 1
# 19 -> 1
# 20 -> 1
# 21 -> 1
# 22 -> 1
# 23 -> 1
# 24 -> 0
# 25 -> 0
# 26 -> 0
# 27 -> 0

tcl编程的更多相关文章

  1. Tcl编程第三天,数学运算

    1.tcl语言没有自己的数学计算,如果想要使用数学公式,必须得用C语言的库.使用方法如下. #!/usr/bin/tclsh set value [expr 8/5] puts $value set ...

  2. Tcl编程第一天,helloworld

    #!/usr/bin/tclsh puts "hello world" 注意:第一行代码表示的是tcl程序运行所需要的文件位置 puts函数代表输出

  3. Linux如何配制Tcl编程环境

    首先,打开终端. 接着在终端输入以下命令: sudo apt-get install tcl

  4. Tcl编程第四天,流程控制语句

    1. if {} { } elseif {} { } else { } 注意: 1.关键字 if elseif else 和大括号之间应该留有间距的.如果紧紧挨着会报错. 2.表条件的判断括号为大括号 ...

  5. SQLite剖析之编程接口详解

    前言 使用过程根据函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fina ...

  6. TCL脚本语言基础介绍

    Tcl简介(一):Tcl 语法 Tcl 语法 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明.如 ...

  7. SQLiteAPI函数详解

    使用的过程根据使用的函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_fin ...

  8. linux下阅读源代码的工具

    说来真是惭愧呀.一直在用VIM 做开发.却不知道VI 里还有这么好使的工具.以前一直都是用: find -type f -print | xargs grep -i **** 在源代码里查找. 原来L ...

  9. T脚本语言学习记录-工具(一)

    1.set & unset %set a Hello ;#定义变量 a 并赋值 =>Hello %puts $a ;#输出变量值 =>Hello %set a “Test Tcl” ...

  10. linux下源代码分析和阅读工具比较

    Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...

随机推荐

  1. [OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形

    目录 1 什么是仿射变换? 2 使用OpenCV进行三角形仿射变换 2.1 定义输入和输出 2.2 计算边界框 2.3 裁剪图像和更改坐标 2.4 计算仿射变换矩形 2.5 应用仿射变换到三角形 2. ...

  2. 从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」

    你好,我是悦创.之前我在 CSDN 编写了一篇开发 Python 库的教程,有人加我提问到的一些问题,我来更新一下这篇文章:https://blog.csdn.net/qq_33254766/arti ...

  3. [数据结构]Dijkstra算法求单源最短路径

    概念 求带权有向图中某个源点到其余各个顶点的最短路径,最常用的是Dijkstra算法.该算法设置一个集合S记录已求得的最短路径的顶点,可用一个数组s[]来实现,初始化为0,当s[Vi]=1时表示将顶点 ...

  4. 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 PY32F0系列上市其实相 ...

  5. 数据结构与算法 -> 并查集

    一.并查集概念 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的合并及查询问题. 它支持两种操作: 查找(Find):确定某个元素处于哪个子集,单次操作时间复杂度 O(α(n)),即查询元 ...

  6. 01-Sed简介

    1 Sed简介 Sed(Stream EDitor)为Uninx系统上提供将编辑工作自动化的编辑器,使用者无需直接编辑数据.使用者可以利用Sed所提供的20多种不同的函数,进行不同的编辑动作. Sed ...

  7. 浅谈RMQ问题

    RMQ:question 有一个长度为 N N N的数组,数组中的数是无序的( 1 < = n < = 5 ∗ 1 0 5 1<=n<=5*10^5 1<=n<=5 ...

  8. jupyter的配置

    step1.安装jupyter 使用pip或者conda等包管理工具安装jupyter(这部分倒是没有任何难度,一般也没有什么坑) conda install jupyter notebook或者pi ...

  9. c++代码实现中时间复杂度的不断优化

    先来介绍一下时间复杂度: 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定量描述了该 ...

  10. 插入排序(CSP-J 2021 T2)我有新思路了,链接:https://www.cnblogs.com/wjk53233/p/16533752.html

    我有新思路了,链接:https://www.cnblogs.com/wjk53233/p/16533752.html 我有新思路了,链接:https://www.cnblogs.com/wjk5323 ...