【Tcl学习笔记】第2章 Tcl语言的语法
目录
- 2.1 脚本、命令和单词
- 2.2 处理命令
- 2.3 替换
- 2.4 引用
- 2.5 参数展开
- 2.6注释
- 2.7 正常返回与异常返回
Tcl的语法:决定如何解析命令的十多条规则。
2.1 脚本、命令和单词
Tcl脚本:
包含一条或多条命令。命令通过换行符或分号隔开。命令:
- 包含由一个或多个单词。单词通过空格或制表符分开。
- 第一个单词是命令名,其他单词是命令的参数。
2.2 处理命令
Tcl 处理一条命令分两步:解析 和 执行。
注意:Tcl解析器在解析命令的时候,并不会为其中的单词赋予任何含义。这些单词的含义取决于具体的命令过程。
常见的参数的意义
expr 24 / 3.2
expr把参数连接成一个数学表达式。lindex {red green blue purple} 2
第一个参数是一个列表,值由空格隔开。
第二个参数为索引(从0开始),命令返回bluestring length helloworld
length 与 string length 组成集合命令,返回第二个参数的长度。button .b -text hello -fg red
.b(组件名)后面的参数为: -选项 值 。
2.3 替换
Tcl的三种替换形式:
- 变量替换
- 命令替换
- 转义替换
注意:
- Tcl解释器在执行命令过程之前进行这些替换。
- [重要]解析命令时只从左到右解析一次,进行一轮替换。
- [重要]每一个字符只会发生一层替换,不会对替换后的结果再进行一次扫描替换。
- 替换可以发生在命令中的任何一个单词上,包括命令名。
- 替换不影响命令中每个单词的分隔。
变量替换
引发:$
符号。
功能:将Tcl变量的值插入单词中。
变量名由$
符号后面所有的数字、字母和下划线组成。
例子:用变量替换新建组件.b1,.b2,.b3,.b4,.b5foreach num{1 2 3 4 5} {button .b$num }
命令替换
引发:[]
符号
功能:把一个单词的部分或全部替换为一个命令的结果。
[]
内的字符必须构成有效的Tcl脚本。转义替换
引发:\
符号
功能:转义字符
Tcl支持的转义字符:字符 替换结果 \a 警告音(0x7) \b 删除(0x8) \f 换页符(0xc) \n 换行符(0xa) \r 回车(0xd) \t 制表符(0x9) \v 垂直制表符(0xb) \ooo 八进制值为ooo(1-3位)的8位Unicode字符 \xhh 十六进制位hh(前两位有效)的8位Unicode字符 \uhhhh 十六进制值为hhhh(1-4位)的16位Unicode字符 \newline以及新行开头的空格 一个空格字符 [注意]\newline和一般的替换不同,这种替换在Tcl解释器解析命令前就要单独进行。为了实现语句太长分行。
2.4 引用
功能:为了阻止解析器对$
和;
等字符进行特殊处理。
除转义外的两种引用形式:
""
功能:取消其中的单词和命令分隔符的特殊解释。
说明:- 如果一个单词(字符串)的第一个字符是
"
,那么这个单词就由另一个"
标记结束。注意双引号本省不是单词的一部分,其中的空格、制表符、换行以及分号都作为普通字符处理。
set msg "Eggs: \$2.18/dozen\nGasoliine: \$1.49/gallon" # 执行结果: Eggs: $2.18/dozen Gasoliine: $1.49/gallon
- 如果单词不是以
"
开头,那么单词中的任何"
都会作为普通字符处理,而不是定界符。
puts This"is"poor"usage # 执行结果: This"is"poor"usage
- [注意]变量替换、命令替换和转义替换在双引号中正常进行。
set a 2.1 set msg "a is \"$a\": the square of a is \"[expr $a * $a]\" " # 执行结果: a is "2.1": the square of a is "4.41"
- 如果一个单词(字符串)的第一个字符是
{}
功能:取消其中所有特殊字符的特殊意义。
说明:- 如果一个单词以
{
开头,那么指导与它配对的}
为止,所有字符都将原封不动的识别位这个单词的值。 - 唯一会执行的替换:\newline,因为它先于解析器解析前替换。
- 大括号可以嵌套使用。
- 注意
{
与前一个单词需要用空格分隔。
proc occur {value list} {set count 0 foreach el $list {if $el==$value {incr count} }return $count } occur 18 {1 34 18 16 18 72 1994 -3}
执行过程:
- 如果一个单词以
2.5 参数展开
某些情况下,单层替换不能完成任务:
例子:删除所有txt类型的文件(1.txt、2.txt和3.txt三个文件)
file delete [glob *.txt]
1. [glob *.txt]
的结果为:1.txt 2.txt 3.txt
2. 1.txt 2.txt 3.txt
作为一个整体传递给file delete(因为解析命令时只从左到右解析一次,进行一轮替换。),功能变成删除名为1.txt 2.txt 3.txt
的文件,发生错误。
如果一个单词以{*}
开头,之后紧接着非空白字符,Tcl会移除开头的`{*},把单词的剩余部分作为含有单词分隔符的语句进行解析替换,即重新替换一次。
[注意]只有Tcl 8.5版本以上支持
file delete {*}[glob *.txt]
等效于:
file delete 1.txt 2.txt 3.txt
对于Tcl 8.5更早的版本,用eval将这些单词重新传给Tcl解释器:
eval file delete [glob *.txt]
2.6注释
注释符#
必须出现在Tcl将获得命令的第一个字符上,其他地方将被挡住普通字符。
# 这是一条评论
set a 100 # 这不是一条评论
set a 100; # 这是一条评论
这将导致大括号内的注释常常会导致错误。
- 尽量避免在注释中出现大括号,如果确实要用,确保{}是成对的。
- 可以用
if 0 {}
实现大段格式正确的代码的注释
2.7 正常返回与异常返回
命令通常会返回字符串结果,但有时会返回错误,导致Tcl命令解释器放弃处理。
出现错误后,Tcl会把全局变量erroInfo
设置为一个栈,保存产生错误的确切位置。可以用puts $erroInfo
输出这个变量的值。
【Tcl学习笔记】第2章 Tcl语言的语法相关推荐
- C程序设计-谭浩强 第三版-学习笔记第1章 C语言概述
第一章 C语言概述 1.C语言历史背景 C语言是在B语言的基础上发展起来的,兼具一般高级语言和低级语言的优点,可用来编写系统软件或应用软件. 1972-1973年,贝尔实验室在B语言基础上设计出C语言 ...
- Go学习笔记(三)Go 语言基础语法
1.Go标记: Go程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Go Go Go") 6个标 ...
- 《Go语言圣经》学习笔记 第十一章 测试
<Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...
- 《Go语言圣经》学习笔记 第六章 方法
<Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- 《Go语言圣经》学习笔记 第四章 复合数据类型
<Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...
- 《Go语言圣经》学习笔记 第三章 基础数据类型
<Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...
- 《Go语言圣经》学习笔记 第七章 接口
<Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...
- 计算机网络学习笔记:第二章
文章目录 计算机网络学习笔记:第二章 前言 2.1.应用层协议原理 2.1.1 网络应用程序体系结构 2.1.2 进程通信 2.1.3 可供应用程序使用的运输服务 2.1.4 因特网提供的传输层服务 ...
- 《C Primer Plus》学习笔记—第9章
目录 <C Primer Plus>学习笔记 第9章 函数 1.复习函数 1.引入 2.创建并使用简单的函数:程序lethead1.c 3.分析程序 4.函数参数 1.程序lethead2 ...
最新文章
- Netty 简单服务器 (三)
- Android开发常用开源框架2
- Python基础语法难点突破
- 传统公司部署OpenStack(t版)简易介绍(一)——环境部署
- 概念验证:玩! 构架
- 小看--单例设计模式
- 将一段区间的偶数分解为两个素数相加(Java)
- JAVA-JSP内置对象之application对象获得其他信息
- 集散型计算机控制系统的缺点,什么是集散控制系统?有什么特点?
- android资源编译失败,在android studio中打开一个新项目时,Android资源编译失败
- Java环境安装手册
- python称号_C 语言荣获 2019 年度最佳编程语言称号
- 5.8 拉普拉斯算子和拉普拉斯矩阵,图拉普拉斯算子推导 意境级讲解
- Python 高层文件操作(shutil模块)(转载)
- Pem私钥pkcs1和pkcs8之间互转
- 蚁群算法原理及Matlab实现
- NFC bcm2079x驱动学习 .
- Kubernetes基础:使用rollout对Deployment进行控制
- ble l2cap 工作过程_从车联网安全到BLE安全(二)
- WannaCry——windows7补丁安装和下载地址