目录

  • 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开始),命令返回blue
    • string length helloworld
      length 与 string length 组成集合命令,返回第二个参数的长度。
    • button .b -text hello -fg red
      .b(组件名)后面的参数为: -选项 值 。

2.3 替换

  • Tcl的三种替换形式:

    • 变量替换
    • 命令替换
    • 转义替换
  • 注意:

    • Tcl解释器在执行命令过程之前进行这些替换。
    • [重要]解析命令时只从左到右解析一次,进行一轮替换。
    • [重要]每一个字符只会发生一层替换,不会对替换后的结果再进行一次扫描替换。
    • 替换可以发生在命令中的任何一个单词上,包括命令名。
    • 替换不影响命令中每个单词的分隔。
  1. 变量替换
    引发:$符号。
    功能:将Tcl变量的值插入单词中。
    变量名由$符号后面所有的数字、字母和下划线组成。
    例子:用变量替换新建组件.b1,.b2,.b3,.b4,.b5

    foreach num{1 2 3 4 5} {button .b$num
    }
    
  2. 命令替换
    引发:[]符号
    功能:把一个单词的部分或全部替换为一个命令的结果。
    []内的字符必须构成有效的Tcl脚本。

  3. 转义替换
    引发:\符号
    功能:转义字符
    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 引用

功能:为了阻止解析器对$;等字符进行特殊处理。
除转义外的两种引用形式:

  1. ""
    功能:取消其中的单词和命令分隔符的特殊解释。
    说明:

    • 如果一个单词(字符串)的第一个字符是",那么这个单词就由另一个"标记结束。注意双引号本省不是单词的一部分,其中的空格、制表符、换行以及分号都作为普通字符处理。
    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"
    
  2. {}
    功能:取消其中所有特殊字符的特殊意义。
    说明:

    • 如果一个单词以{开头,那么指导与它配对的}为止,所有字符都将原封不动的识别位这个单词的值。
    • 唯一会执行的替换:\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语言的语法相关推荐

  1. C程序设计-谭浩强 第三版-学习笔记第1章 C语言概述

    第一章 C语言概述 1.C语言历史背景 C语言是在B语言的基础上发展起来的,兼具一般高级语言和低级语言的优点,可用来编写系统软件或应用软件. 1972-1973年,贝尔实验室在B语言基础上设计出C语言 ...

  2. Go学习笔记(三)Go 语言基础语法

    1.Go标记: Go程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Go Go Go") 6个标 ...

  3. 《Go语言圣经》学习笔记 第十一章 测试

    <Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...

  4. 《Go语言圣经》学习笔记 第六章 方法

    <Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...

  5. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  6. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

  7. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  8. 《Go语言圣经》学习笔记 第七章 接口

    <Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...

  9. 计算机网络学习笔记:第二章

    文章目录 计算机网络学习笔记:第二章 前言 2.1.应用层协议原理 2.1.1 网络应用程序体系结构 2.1.2 进程通信 2.1.3 可供应用程序使用的运输服务 2.1.4 因特网提供的传输层服务 ...

  10. 《C Primer Plus》学习笔记—第9章

    目录 <C Primer Plus>学习笔记 第9章 函数 1.复习函数 1.引入 2.创建并使用简单的函数:程序lethead1.c 3.分析程序 4.函数参数 1.程序lethead2 ...

最新文章

  1. Netty 简单服务器 (三)
  2. Android开发常用开源框架2
  3. Python基础语法难点突破
  4. 传统公司部署OpenStack(t版)简易介绍(一)——环境部署
  5. 概念验证:玩! 构架
  6. 小看--单例设计模式
  7. 将一段区间的偶数分解为两个素数相加(Java)
  8. JAVA-JSP内置对象之application对象获得其他信息
  9. 集散型计算机控制系统的缺点,什么是集散控制系统?有什么特点?
  10. android资源编译失败,在android studio中打开一个新项目时,Android资源编译失败
  11. Java环境安装手册
  12. python称号_C 语言荣获 2019 年度最佳编程语言称号
  13. 5.8 拉普拉斯算子和拉普拉斯矩阵,图拉普拉斯算子推导 意境级讲解
  14. Python 高层文件操作(shutil模块)(转载)
  15. Pem私钥pkcs1和pkcs8之间互转
  16. 蚁群算法原理及Matlab实现
  17. NFC bcm2079x驱动学习 .
  18. Kubernetes基础:使用rollout对Deployment进行控制
  19. ble l2cap 工作过程_从车联网安全到BLE安全(二)
  20. WannaCry——windows7补丁安装和下载地址

热门文章

  1. QQ电脑管家 vs 360 安全助手 (客观+主观)
  2. 给大学生的劝告,你们为何应该开始接触 Unix/Linux
  3. FAT32文件系统介绍
  4. Linux下fat32文件系统变为只读
  5. 第一颗国产HDMI 1.4 至 TTL / 2 端口 LVDS 芯片LT8619C
  6. 高等代数期末考试题库及答案_高等代数二考试题及答案期末答案
  7. word中将宏模块添加到Normal.dotm模板中
  8. php模版推送方法,PHP快速推送微信模板消息
  9. 矩阵的 正定与半正定
  10. 系统背景描述_多元化多功能会议室报告厅智能控制系统方案