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. UOJ33 [UR#2] 树上 GCD

    UOJ33 [UR#2] 树上 GCD 简要题意: 给定一棵有根树,对于每个 \(i \in [1,n)\),求出下式的值: \[Ans[i] = \sum_{u<v} \gcd({\rm{di ...

  2. PostgreSQL(02): PostgreSQL常用命令

    目录 PostgreSQL(01): Ubuntu20.04/22.04 PostgreSQL 安装配置记录 PostgreSQL(02): PostgreSQL常用命令 PostgreSQL 常用命 ...

  3. solidity 内存(memory) 可变数组的增删改查 操作

    // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; library Array { function push(uint256[] memo ...

  4. 使用 Link Cut Tree 维护最小生成树

    简介 本文将简单介绍如何使用 Link Cut Tree 维护动态图最小生成树. 思路 最小生成树的性质:一个基环树的最小生成树,为将环上边权最大的边删除后所组成的树. Proof:如果删除环上的其他 ...

  5. 02-Tcl输出、赋值与替换

    2 Tcl输出.赋值与替换 2.1 puts Tcl的输出命令是puts,将字符串标准输出channelled.语法中两个问号之间的参数为可选参数. # 例1 puts hello # 输出 hell ...

  6. 模板层之标签、自定义模板语法、母版(模版)的继承与导入、模型层前期准备知识点、ORM常用关键字

    今日内容概要 模板层之标签 if判断 {% if 条件1 %} #条件1成立 <p>Hello!</p> #执行 {% elif 条件2 %} #条件1不成立 条件2成立 &l ...

  7. 使用小黄鸟(HttpCanary)+模拟器(VMOS Pro)对手机APP进行抓包

    最近接触app开发,苦于app端不能像网页端可以F12看请求信息,对于后端来说当接口出现异常却不能拿到请求参数是很苦恼的, 因为之前了解过逍遥模拟器,先使用了模拟器对appj进行抓包,但发现这一款ap ...

  8. angular + ng-zorro 表格后台分页及排序功能实现,angular + ng-zorro 表格排序不起作用解决办法

    angular + ng-zorro 表格排序不起作用是因为数据是从后端获取的,也是后端分页,所以要自己写排序啦~~~~ 举例:HTML <nz-table #basicTable nzBord ...

  9. 面试必问:说一下 Java 虚拟机的内存布局?

    我们通常所说的 Java 虚拟机(JVM)的内存布局,一般是指 Java 虚拟机的运行时数据区(Runtime Data Area),也就是当字节码被类加载器加载之后的执行区域划分.当然它通常是 JV ...

  10. DJI Flight Simulator 无人机模拟器 功能介绍与使用说明

    0 前言 无人机是当前非常火热的"相机设备",而大疆又是其中翘楚,功能丰富,可以说是一个将带着云台的智能手机放到了天空中.如果你有自己玩过旋翼无人机航模的话,可能会体会到大疆的另一 ...