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. [编程基础] C#自定义类调用窗体控件

    如果自定义类需要调用窗体控件,首先需要将窗体控件的可见级别(Modifiers)设为public.如下图所示: 然后在Form1类下定义静态变量form1,并初始化. class Form1: For ...

  2. 浅谈LCA问题(最近公共祖先)(四种做法)

    [模板]最近公共祖先(LCA) \(update \ 2023.1.3\) 新增了树链剖分 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 \ ...

  3. VUEX state 的使用学习二

    转载请注明出处: state 提供唯一的数据资源,所有的共享的数据都要统一放到store 中的state中进行存储; 状态state用于存储所有组件的数据. 管理数据 // 初始化vuex对象 con ...

  4. 在统信UOS上将桌面窗口输出到Windows机器上的Xming

    目前所用版本是统信UOS V20,具体版本是家庭版22.0. 先尝试了一下,统信UOS自带的lightdm通过XDMCP无法正常输出到Windows机器上的Xming.VcXsrv.X Manager ...

  5. angular父子组件传值,子组件传值给父组件,父组件又传值给子组件

  6. Redis - 介绍与使用场景

    简介 Redis 的全称是 Remote Dictionary Server,是一个使用 C 语言编写的.开源的(BSD 许可)高性能非关系型(NoSQL)的键值对数据库. Redis 的数据是存储在 ...

  7. drf-day5——反序列化类校验部分源码分析、断言、drf请求、drf响应、视图组件及两个视图基类、基于GenericAPIView+5个视图扩展类

    目录 一.反序列化类校验部分源码解析(了解) 二.断言 三.drf之请求 3.1 Request能够解析的前端传入的编码格式 3.2 Request类有哪些属性和方法(学过) 常用参数 Respons ...

  8. Pytest插件pytest-assume多重断言

    Pytest插件pytest-assume多重断言 背景 import pytest def test_assume1(): assert 1 == 2 print('hello') assert 2 ...

  9. (一) MdbCluster分布式内存数据库——基础架构介绍

    (一) MdbCluster分布式内存数据库--基础架构介绍   这个项目是怎么开始的我已经有些记不清楚了,大概是原来的内存数据库很不好用,一次次地让我们踩坑,我又自以为是地觉得可以做一个更好的出来. ...

  10. Java堆外缓存(一个很有意思的应用)

    我们在开发过程中会遇到这样的场景:就是一个服务的各项 JVM 的配置都比较合理的情况下,它的 GC 情况还是不容乐观.分析之后发现有 2 个对象特别巨大,占了总存活堆内存的 90%以上.其中第 1 大 ...