寫於2021-12-03 19:08
該文章最初的目的只是為了記錄我個人的學習筆記,所以有些地方可能寫得不是很清楚,請大家見諒!
有問題或者有補充的地方可在評論區留言!!!
tcl解釋器官方下載地址: https://www.activestate.com/products/tcl/
第一章 Tcl基礎知識
總結: 在tcl中,一切皆字符串
變量命名規則:沒有任何限制,分區大小寫
Tcl對命令的求值過程:解析和執行
解析:把命令拆分為一個個獨立的單詞,同時進行必要的置換。
執行:把第一個單詞作為命令,其余單詞作為參數,並檢查是否滿足該命令要求,不滿足要求將錯誤信息保存在全局變量errorInfo中。
Tcl命令構成:命令名 參數1 參數2 ... 參數N
Tcl三類置換:變量置換,命令置換,反斜線置換
Tcl注釋方法:if,花括號,proc,#
- 在采用分號作為命令之間的分隔符時,分號左側命令不會顯示輸出結果(
set a 6;set b 9只會顯示9); - incr命令后的兩個參數都必須是整型數據;
$var與set var等效;- 在同時使用雙引號和花括號時,最外層的起主導作用;
- Tcl會把"-"、"."當作分隔符,所以變量名有"-"時,變量置換通過"{}"括起來(
{a-b-c}); \可實現續行功能,“\”后不能跟隨任何字符,包括空格和制表符。
| 命令 | 功能 |
|---|---|
| info exists | 判斷變量是否存在 |
| info hostname | 返回主機名 |
| info tclversion | 返回tcl解釋器版本信息 |
| unset | 取消變量定義並釋放內存空間 |
第二章 表達式
總結:
算術操作符
- 對於
a/b和a%b,結果滿足a=q*b+r,且0 ≤ |r| < |b|,r與q同符號。
Tcl常用函數
abs(x)、fmod(x,y)(x除以y的余數)、max(x)、min(x)、pow(x,y)、sqrt(x)、round(x)(對x進行四舍五入得到的整型值)、rand()(產生在[0,1]區間的偽隨機浮點數)、srand(x)(使用整數種子x重設隨機數生成器)、ceil(x)(向上取整)、floor(x)(向下取整);bool(x)、double(x)、int(x);- 真:
非0、yes、on、true;假:0、no、off、false; - 字符串是否相等比較:
eq、ne。
第三章 字符串
總結:
-
可以使用 end±i 作為字符串中最后一個字符的索引值的命令(end±i中間不允許出現空格):
string index、string range、string replace,lindex、lrange; -
直接原地修改變量的命令(看對變量操作時是否有用“$”符號):
append、lappend、lset、; -
string repeat可以指定字符串的重復次數
string repeat a 5
=>aaaaa
append直接修改原始變量的值,沒有新創建變量,例:
set str hello
set v tcl
apped str $v
puts $str
=>hello tcl
string compare(非判斷兩字符串是否嚴格相等)、string equal、eq、==進行兩個字符串比較,區分大小寫,如果不區分,需要添加-nocase參數,-length i限定只對前i個字符進行判斷,例:string equal -length 3 hello Hello
| 命令 | 功能 | 例 |
|---|---|---|
| string repeat | 把指定字符串重復指定次數 | string repeat a 5 |
| string is | 判定字符串是否為指定類型 | string is ascii 32 |
| string length | 可獲取字符串中字符的個數 | |
| string index | 根據索引值獲取字符 | string index $str end-1 |
| string range | 根據索引區間獲取字符 | string range $str end-2 end |
| append | 在字符串末尾添加新的字符串 | |
| string replace | 根據索引區間刪除或替換字符 | string replace $str end-2 end "hello tcl" |
| string compare | 對兩個字符串進行比較 | |
| string equal | 判斷兩個字符串是否相等 | string equal -length 3 hello Hello |
| string frist | 從字符串頭部至字符串尾部搜索與指定字符串相同的子字符串 | string first th $str 10 |
| string last | 從字符串尾部至字符串頭部搜索與指定字符串相同的子字符串 | |
| string match | 用於通配符樣式的匹配 | string match t* tcl |
| format | 將字符串按照指定格式顯示 | |
| string totitle | 將字符串轉換為標題形式 | |
| string toupper | 將字符串中的小寫字母轉換為大寫字母 | |
| string tolower | 將字符串中的大寫字母轉換為小寫字母 | |
| string trim | 去除字符串開頭和結尾處的裁剪字符 | |
| string trimleft | 只去除字符串開頭處的裁剪字符 | |
| string trimright | 只去除字符串結尾處的裁剪字符 |
第四章 列表
總結:
已在第三章概括。
| 命令 | 功能 | 語法 |
|---|---|---|
| list | 創建列表 | list后直接跟隨列表元素 |
| concat | 拼接多個列表,合成一個新的列表 | concat后可以跟隨一個或多個列表 |
| lrepeat | 通過重復元素集合的方式創建列表 | lrepeat+重復次數+重復元素 |
| llength | 獲取列表長度(列表中的元素個數) | llength+列表名 |
| lindex | 根據索引值獲取列表長度 | lindex+列表名+索引參數 |
| lrange | 獲取索引值指定范圍內的列表長度 | lrange+列表+第一個索引值+第二個索引值 |
| lassign | 獲取列表元素,並將其分配給指定變量 | lassign+列表+變量名 |
| lappend | 向列表末尾添加新元素 | lappend+列表名(不加$符號)+新加的元素 |
| linsert | 向列表的指定位置添加新元素 | linsert+列表+新元素的起始索引+新元素(原列表沒有改動) |
| lreplace | 刪除或替換索引值指定范圍內的列表元素 | lreplace+列表+待刪除元素起始索引+終止元素索引 |
| lset | 替換索引值指定位置上的列表元素 | lset+列表名(不加$符號)+替換索引+替換值 |
| lsearch | 根據搜索模式和匹配模式查找目標列表元素 | lsearch+列表+匹配模式(-glob、-exact、regexp) |
| lsort | 對列表元素進行排序 | lsort+(-ascii -increasing or -decreasing、-integer、-real、-unique、-index) |
| split | 根據分割字符分割字符串,並創建列表 | split+字符串變量+分割字符 |
| join | 把列表元素串接成一個字符串 | join+列表+分割字符 |
| foreach | 遍歷列表元素,執行循環腳本 | foreach+變量名+列表+構成循環體的tcl腳本 |
第五章 數組
總結:
構成數組的三個要素:數組名+元素+值
| 命令 | 功能 | 語法 |
|---|---|---|
| array exists | 判定數組是否已創建,若創建,返回1否則返回0 | array exists + 數組名 |
| array size | 獲取數組大小 | array size + 數組名 |
| array set | 創建數組 | array set + 數組名 + 數組元素 |
| array names | 獲取數組的元素名列表 | array names + 數組名 |
| array get | 獲取數組的“元素名 值”列表 | array get + 數組名 |
| parray | 輸出數組元素 | parray + 數組名 |
| array unset | 刪除數組 | array unset + 數組名 |
第六章 流程控制
總結:
- if 命令規定每一個左花括號都必須與它的前一個字符同行
- else只是if命令的可選子句,在使用時,要將其與if中第二個參數的右花括號放在同一行,而不能另起一行(elseif也如此)
- 在使用switch命令時,可通過短畫線“-”將相同腳本的不同匹配模式捆綁在一起,使代碼更簡潔。
- 在switch中添加注釋時,應該把注釋寫在匹配模式對應的腳本中
| switch模式匹配方式 | 含義 |
|---|---|
| -exact | 嚴格的字符串比較 |
| -glob | sting match命令下的匹配 |
| -regexp | 正則表達式匹配 |
第七章 過程
總結:
- 參數名在參數名列表中的順序是:
無默認值的參數名、帶默認值的參數名、特殊參數名args,args一定要位於最后; return可使用-code參數返回額外的信息;- 在過程中使用全局變量,可以使用
global命令實現,一旦調用,一直生效直到過程返回; - 全局變量可通過局部變量的引用來更新
upvar X y,X為全局變量,y為局部變量; - 無論所處多少層級,都可通過
#0的形式表明訪問的變量為全局變量; - 有特殊參數
args時,會把剩余參數當作一個列表傳入過程。
| 命令 | 功能 | 語法 |
|---|---|---|
| proc | 跟隨三個參數,即過程名、參數名列表和過程塊 | |
| 過程的參數名列表 | 參數名列表可以為空,參數可以帶默認值,也可以帶特殊參數args | |
| 過程的返回值 | 可以由return返回,若返回多個值,可以將其放入列表中一次返回 | |
| 局部變量與全局變量 | 過程塊內為局部變量,過程塊外為全局變量 | |
| global | 在過程塊內用global命令指明該變量為全局變量 | |
| upvar | 三個應用場景:模擬引用;過程塊訪問數組;給變量起別名 | |
| info level | 返回當前層級信息 |
第八章 命名空間
總結:
1. variable創建命名空間變量,並對其初始化,每個過程內都需要再次寫variable+變量名;但是如果變量是數組,必須使用array set進行數組的初始化。
2. 變量作用域:·全局變量>命名空間變量>局部變量
3.命名空間變量不可以向下傳遞
| 命令 | 功能 | 語法 |
|---|---|---|
| namespace eval | 創建命名空間 | |
| namespace children | 返回指定命名空間的子空間 | |
| namespace parent | 返回指定命名空間的父空間 | |
| namespace exists | 確定命名空間是否存在 | |
| namespace qualifiers | 返回參數中最后一個命名空間分隔符之前的所有字符 | |
| namespace tail | 返回參數中最后一個命名空間分隔符之后的所有字符 | |
| namespace delete | 刪除指定的命名空間 | |
| variable | 創建命名空間變量,並對其初始化,也可在過程中使用該命令引用命名空間變量 | |
| namespace current | 返回當前命名空間名稱 | |
| namespace upvar | 引用指定命名空間中的命名空間變量 | |
| namespace export | 導出命名空間中的命令 | |
| namespace import | 導入命名空間中的命令 | |
| namespace forget | 遺忘在指定的命名空間 | |
| info command | 返回指定命名空間包含的所有命名 | |
| namespace origin | 返回導入命令的原始來源 | |
| namespace ensemble create | 創建集合命令 |
第九章 訪問文件
總結:
1. file delete刪除非空目錄,需要加參數-force,會遞歸刪除,需謹慎使用;
2. file copy復制的文件如果已存在會報錯,想覆蓋可加-force,可同時復制多個文件;
3. file rename目標文件已存在會報錯,想覆蓋可加-force;
4. glob沒有匹配到文件會報錯,不讓報錯可加-nocomplain;
5. puts加-nonewline可阻止寫入的文件換行;
6. file stat可一次性得到文件的各種信息,例:file stat readme.txt finfo,finfo是一個數組,用以儲存文件信息。查看信息:parray finfo、puts $finfo[atime]
| 命令 | 功能 | 語法 |
|---|---|---|
| file dirname | 返回文件的絕對路徑不含文件名 | |
| file extension | 返回文件的擴展名 | |
| file nativename | 返回原生格式的文件名 | |
| file rootname | 返回文件名除擴展名之外的部分 | |
| file tail | 返回文件的最后一個部分,即最后一個子目錄下的文件名稱 | |
| file split | 將文件名按正斜線“/”所在位置進行分割,並返回各部分字符串 | |
| file join | 將給定字符串拼接為文件路徑 | |
| pwd | 打印當前工作目錄 | |
| cd | 切換當前工作目錄到指定目錄 | |
| glob | 根據模式獲取當前工作目錄下的內容 | |
| file mkdir | 在當前工作目錄下創建一個新的目錄 | |
| file delete | 刪除指定的文件或目錄 | |
| file copy | 可將源文件復制到目標文件 | |
| file rename | 為指定的文件或目錄重新命名 | |
| file exists | 查看文件或目錄是否存在 | |
| file isfile | 判斷指定的內容是否為文件 | |
| file isdirectory | 判斷指定的內容是否為目錄 | |
| file type | 查看指定內容的類型 | |
| file readable | 當指定文件存在且用戶有讀權限時返回1,否則返回0 | |
| file writable | 當指定文件存在且用戶有寫權限時返回1,否則返回0 | |
| file executable | 當指定文件存在且用戶有運行權限時返回1,否則返回0 | |
| file stat | 可一次性得到文件的各種信息 | |
| open | 根據指定模式打開文件 | |
| read | 讀取文件內容 | |
| close | 關閉文件 | |
| file size | 獲取文件大小(以字節為單位) | |
| gets | 獲取文件行內容 | |
| eof | 讀取到文件末尾,該命令返回1 | |
| csv::split | 根據分隔符分割csv格式的內容 | |
| csv::read2matrix | 將csv文件內容讀取到矩陣中 | |
| csv::read2queue | 獎csv文件內容讀取到隊列中 | |
| csv::join | 將列表元素按照分隔符拼接為csv格式的內容 | |
| csv::joinlist | 將嵌套列表按照分隔符拼接為csv格式的內容 |
