寫於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格式的內容 |