当前位置:   article > 正文

tcl脚本学习-基础语法_tcl脚本怎么把一行字符串变成一列

tcl脚本怎么把一行字符串变成一列

本文参考公众号

数字IC与硬件设计的两居室

文章目录

tcl介绍

复杂文本处理
Tcl可以把文本中的每一行变为一个列表,最简单的列表就是包含由任意个空格、制表符、换行符分隔开的任意多个元素的字符串,可以直接根据元素编号来获取字符串内容

Tcl也支持正则表达式

自动化执行flow
对于一些流程化的flow,可以编写Tcl脚本来自动执行,一键得到结果和report

辅助EDA开发
Tcl易上手、使用简便,可以简便地设计图形化界面;也可以针对大型项目设计EDA辅助工具

Tcl脚本简介
Tcl即Tool command language工具控制语言,读作Tickle

Tcl包含了一个脚本语言和一个库包:Tcl脚本主要用于发布命令给交互程序,语法简单、扩展性强;Tcl库可以被嵌入应用程序,它包含了一个分析器、用于执行内建命令的例程和一个可以允许用户扩充的库函数。使用Tcl库,应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的输入中读取,Tcl库收到命令后将他分解并执行内建的命令。

目前大部分EDA工具都支持Tcl语言,如Design Complier、quartus、Synplify、modesim、finesim等,Tcl在IC设计中非常常用

Tcl程序有两种运行方式,一种是将程序写入脚本中,通常以.tcl命名;另一种是在tcl命令行中直接执行(在windows中通过命令提示符操作,输入tclsh)。

语法学习

本文通过实际的代码案例介绍TCL的相关语法

#布尔型,非0,yes,true均视为真
if {yes} {
     puts "BOOL: true(yes)"
}
# BOOL: true(yes)
if {-1} {
     puts "BOOL: true(-1)"
}
# BOOL: true(-1)

#数组
set lib(yh) 1
set lib(xhg) 2
puts $lib(yh)
# 1
array set student {1 yh 2 xhg 3 hsy}
puts $student(1)
# yh

#列表
set student {yh xhg hsy hqd hc cky yq}
puts "$student"
puts "[lindex $student 0]"
puts "[lindex $student 6]"

# yh xhg hsy hqd hc cky yq
# yh
# yq

#字典
dict set food day1 pork
dict set food day2 beef
dict set food day3 lamb
puts "food schedule: $food"
#food schedule: day1 pork day2 beef day3 lamb
dict get $food day2
# beef

#一次性设置多个key和value
set animals [dict create anm1 cat anm2 pig anm3 goat]
set animal_my [dict get $animals anm2]
puts "Her favourite animals is: $animal_my"
# Her favourite animals is: pig

#TCL的数据类型仅有字符串一种,所以变量间进行数学表达式运算时,需要使用命令 expr 加以识别
set a 10
set b [expr $a+10]
puts "results: $b" 
# results: 20

#if语句与反斜杠符号用法
set a 10
set b 20
if {$a < $b} {puts "\$a < \$b" } else {puts "\$a > \$b"}; #添加反斜杠符号
# $a < $b
if {$a < $b} {puts "$a < $b" } else {puts "$a > $b"}; #不添加反斜杠符号
# 10 < 20

#switch语法
switch vars {
case1 { 
       true_statement1 
}
case2 {
       true_statement2 
}
......
caseN {
       true_statementN 
}
default {
default_statement 
}
}

#循环语句

#while循环
set i 0
while {$i <=4} {
incr i
puts $i
}
#"icr i"表示i++, "icr i -1"表示i--
# 1
# 2
# 3
# 4 
# 5

#for循环
for {set i 0} {$i<=3} {incr i} {
   puts $i
}
#% 0
#% 1
#% 2
#% 3

#foreach循环
 set student {yh xhg hsy hqd}
 foreach vars $student {puts $vars} #一定要添加vars,否则会报错
# yh
# xhg
# hsy
# hqd

foreach {var1 var2 var3} {a b c d e f} var4 {g h} {
   puts "The vars are: $var1, $var2, $var3, $var4"
}
# The vars are: a, b, c, g
# The vars are: d, e, f, h

foreach {var1 var2} {a b c d } {var3 var4} {e f g h} {
   puts "The vars are: $var1, $var2, $var3, $var4"
}
#The vars are: a, b, e, f
#The vars are: c, d, g, h

#foreach遍历数组
array set lib {1 yh 2 wtw 3 xhg}
foreach {index value} [array get lib] {
puts "\$lib($index) = $value"}
# $lib(1) = yh
# $lib(2) = wtw
# $lib(3) = xhg 

#拼接字符串
set str1 "hello"
set str2 "world"
append str1 $str2 "!"
puts $str1
#helloworld!

set str1 "i'm studying"
append str1 " TCL"
puts $str1
# i'm studying TCL

#string
set str1 wtw
set str2 yh
string compare $str1 $str2
#大于,相等,小于分布返回1,0,-1
# -1

set str wtw
string toupper $str
#换成大写字母
# WTW

# string match
string match -nocase {yh*wtw} "yhlovewtw"
# *表示0到n个字符不比,前后只要相同即可
# nocase表示不区分大小写
# 1
string match -nocase {yh*wtw} "yhlovewtw_"
# 0
string match -nocase {yh?wtw} "yh_wtw"
# ?表示只有一个字符不参与比较
# 1
string match -nocase {yh[a-z]*} "yhwtw"
# []表示字符串中满足[]其内的字符任意一个
# 1


set a {12}
set b {345}
set c {6789}
lappend a $b
lappend a $c
#如何从a中得到6?
set str [lindex $a 2]
string range $str 0 0

# regexp实现正则匹配分析
% set str "foreverrr young."
#匹配任意一个字符,作用于r
% regexp {ever.} $str mat1
#1
#匹配0个或者多个字符,作用于n
% regexp {even*} $str mat1
#1
% regexp {even.} $str mat1
#0
#匹配一个或多个字符
% regexp {ever+} $str mat2
#1
% regexp {even+} $str mat2
#0
#匹配0个或者1个
% regexp {even?} $str mat2
#1
% regexp {ever.*} $str mat1
#1


set str "Foreverrr Young."
# 以下两行会匹配 “ever.” 以及之后所有字符
puts "[regexp {ever.*} $str mat1]"
puts "[regexp {ever.+} $str mat2]"
# 字符串中 “ung.” 之后没有字符,所以第 4 行匹配失败
puts "[regexp {ung.*} $str mat3]"
puts "[regexp {ung.+} $str]"
puts "$mat1-$mat2-$mat3"

#()用于捕获子表达式匹配,可以将连续的复杂的匹配模式分割成多个子表达式,并将匹配到多个子表达式的结果进行缓存,称为捕获,实现更加精准的匹配。
#例如以下示例中,匹配时会按照“Forever You”字符串匹配,并把匹配到的字符串赋值到变量 mat 中。由于括号即捕获子表达式匹配的存在,又会将各个括号内的匹配结果分别赋值到 3 个变量中。
set str "Foreverrr Young."
puts "[regexp {(For?)(ever*)( You?)} \
               $str mat mat1 mat2 mat3]"
#1
puts $mat
#Foreverrr You
puts "$mat1-$mat2-$mat3"
#For-everrr- You

#“[]”(中括号) 为区间匹配,用于匹配字符串中的一个字符,即中括号内的多个字符只要有一个能匹配到字符串中存在的字符,便为匹配成功。
#中括号内如果存在以“^”(尖号) 开头的匹配方法,则表示取非的匹配效果。^如果作为匹配符,可用于匹配开头
set str "bbabc112ccd"
# 匹配失败
puts [regexp {bac} $str mat1_char]
# 0
# 下面两行效果一样:只匹配一个字符
regexp {[abc]} $str char_mat1
regexp {[a-c]} $str char_mat2
regexp {[a-c]+} $str char_mat3 ;#bbabc, 匹配[]中的abc,只要任意一个符合即可,然后+,表示匹配一个或多个
regexp {[^a-c]} $str char_mat4
regexp {[0-9]} $str num_mat2
regexp {[0-9]+} $str num_mat3
regexp {[^0-9]} $str num_mat4
puts $char_mat1
# b
puts "$char_mat2-$char_mat3-$char_mat4"
# b-bbabc-1
puts "$num_mat2-$num_mat3-$num_mat4"
# 1-112-b

#“|”(竖号) 为交替匹配,只要匹配到该符号两边的任一个模式,即为匹配成功。
set str "Forever Young."
regexp {Young|ever} $str mat1
puts $mat1
# ever
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243

更多语法有待后续学习。。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/188004?site
推荐阅读
相关标签
  

闽ICP备14008679号