Tcl學習之--語法|變數
【語法|變數】
l 指令碼、命令和單詞
Tcl提供了大約100條命令,Tk提供了另外幾十條,指令碼包含一條或多條,通過換行符或分號分隔開.
set a 12
set b 23
也可以寫成一行: set a 12; set b 23
每個命令由多個單片語成,以空格來分隔,首字母為命令名,所以:
1. set -> 單詞,同時也是命令名
2. a -> 單詞
3. 12 -> 單詞,將該值賦予a
l 處理命令
Tcl處理命令分兩步: 解析和執行
1) 在解析階段,Tcl進行一系列簡單字串操作,比如將$input變數中存放的input字串來代替
2) 在執行階段,命令中的各個單詞有了具體含義。Tcl把第一個單詞作為命令名稱,並根據傳遞過來的引數,執行該命令。
圖示如下:
l 替換
方式一:變數替換
例1: 計算或賦值
例2: 建立4個按鈕事件 分別為 .b1,.b2, .b3, .b4
% foreach num {1 2 3 4} { button.b$num }
備註:
替換不影響命令中每個單詞的分割,即使替換後的字元包括空格,製表符,換行符,等空白字元,也不影響。
方式二: 命令替換
備註:
命令替換是把一個單詞的部分或全部替換為一個命令的結果,通過[]來進行,會呼叫[]中的命令,比如上面的expr命令.
方式三: 反斜槓替換
用於向單詞中插入像\n、[、$、空格符這樣會被Tcl解析器認為有特殊含義的字元,如下所示:
備註:
反斜槓替換和一般的替換不同,這種替換在Tcl直譯器解釋命令前就要單獨進行,這意味著用於替換空格符會被作為單詞分隔符看待,除非它們被””
l 雙引號引用
Tcl中提供了一些方法,可以阻止解析器對$和分號等字元進行處理,這些方法稱為引用。
例1: 要將hello world賦給msg,不用雙引號的話會報錯.
這個時候就需要引用:
例2: 將空格、製表符、換行以及分號做普通字元處理.
例3: 將msg設定為包含一個變數名,該變數平方等資訊的字串
l 大括號引用
如果說雙引號對\n還會做特殊處理的話,那麼大括號則是更徹底的引用形式,它會取消其中所有特殊字元的特殊意義。所有的空格,製表符,換行符以及分號都會作為普通字元處理。
例1: 將上面msg資訊如實打印出來
l 引數展開
Tcl會將一個列表作為引數傳遞給一個過程。先看一個例子:
例1: 要將d:\test目錄下,所有.h結尾的檔案刪除.
像上面是刪除不掉的,為什麼呢?因為glob命令返回的是一符合*.h形式的檔案列表,例如a.h, b.h, c.h, d.h,整個檔案列表作為一個引數傳遞給file delete命令,會因為找不到a.h, b.h,c.h,d.h而刪除失敗.那麼要如何刪掉呢?
方式一: 開頭加個{*}
方式二: 檔名全部列出
方式三: 藉助eval命令解析,讓其重新傳給filedelete
l 註釋
如果一條命令的第一個非空白字元是#,那麼這一行將被視為註釋。注意:註釋符必須出現在Tcl預期將獲得命令的第一個字元位置上。如果註釋出現在其他地方,會被看作一個普通字元,看成一個命令單詞的一部分。
第二行#出現在一條命令中間,導致該set命令接收到3個引數,所以錯誤。最後一個#被視為註釋符是因為它緊接在標誌一條命令終止的;後面。要準確理解上面標紅的意思,再看下面兩個例子。
例1: {}中非註釋的情況
{}中的所有字元被視為一個引數,作為字串賦給set指定的變數,所以不是註釋!
例2: {}中註釋的情況
這裡面有兩個{},if命令會把第一個{}視為boolean型表示式處理,如果為真的話,它會呼叫Tcl直譯器將第二個引數作為Tcl指令碼處理。在Tcl解析器再次進行解析時,以#開頭的第一行才被識別為註釋。
例3: 出現在註釋中的大括號常導致錯誤
另外一種用途,用if命令來將多行註釋。看下面例子.
在Java中可以用
/*
*/
在Python中用三個單引號對,或三個雙引號對來多行註釋。
Tcl中可以用if 命令來達到同樣的效果: 多行註釋的問題。
If 0,即條件為假,下面的分支就不走了,從而達到註釋的目的。
l errorInfo
異常返回的時候,錯誤資訊會儲存在全域性變數errorInfo中,
出現錯誤後,Tcl會把errorInfo設定為一個棧,儲存產生錯誤的確切位置,可以用puts $errorInfo輸出這個變數的值。
l set命令
該命令可以用來建立、讀取和修改,第一個引數是變數名,第二個引數如果有話,是變數的新值.
l append命令
該命令用於在字串的末尾新增一個字元,特點:因這是Tcl的內部表示式,處理起來速度快!
l 陣列
陣列是元素的集合,每一個元素有自己的名字和值的變數。包括兩部分:陣列名+陣列中的元素名.下面是常見的兩種陣列定義方式:
方式一:set arrayName(element)方式
方式二: array set arrayName{} 方式
備註:
1. 在Tcl中陣列是無序的資料結構(以雜湊表的方式儲存),而列表才是有序的排列.
2. 如果陣列的元素包含空格,則需要用\轉譯,或變數替換
l 陣列的相關命令
命令一: array names arrayName:返回指定陣列的元素列表
命令二: array size arrayName: 陣列中定義了多少個元素
命令三: array exists arrayName: 用於檢驗某個陣列是否存在.
命令四: array set和array get: 後者是獲取陣列的字典
陣列遍歷: 一般用foreach來遍歷陣列,例如:
l incr命令
該命令提供了改變變數值的簡單方法.incr讀入兩個引數,分別是變數名和一個整數
8.5之前對不存在的變數,比如說上面的變數y,會報錯!但在8.5及之後的版本,會建立該變數,預設+1.
l unset命令和array unset
unset命令用於銷燬變數。可以接收多個變數,每個引數為變數名,也即意味著,一次可以刪除多個變數,比如說:
array unset用於銷燬陣列:
l 預定義變數
Tcl庫自動建立和管理了一些全域性變數。最常用的部分如下:
1. argv0, argc, argv
2. env
3. tcl_platform
l 其他變數功能
tace命令: 用於監視變數,在變數設定、被讀取、或被刪除時呼叫指定的Tcl指令碼。Trace命令在除錯時很有用,該變數還允許建立只讀變數,可以把變數跟蹤用於“傳播”,例如:只要變數值發生變化,資料庫或螢幕上顯示的值就即時更新。
global和upvar命令:可由過程使用,訪問不由它所有的區域性變數。
namespace命令:建立並管理名稱空間,名稱空間是命令和變數的命名集合。名稱空間可以將命令和變數分隔開來,確保他們不會干擾其他名稱空間中的命令和變數。
相關推薦
Tcl學習之--語法|變數
【語法|變數】 l 指令碼、命令和單詞 Tcl提供了大約100條命令,Tk提供了另外幾十條,指令碼包含一條或多條,通過換行符或分號分隔開. set a 12 set b 23 也可以寫成一行: se
Tcl學習之--列表|字典
bsp 之間 索引 sof rst 匹配 產生 進行 而且 【列表|字典】 Tcl使用列表來處理各種集合,比方一個目錄中的全部文件,以及一個組件的全部選項。最簡單的列表就是包括由隨意個空格、制表符、換行符、分隔的隨意多個元素的字符串。比方: JerryAlice Man
Tcl學習之--字符串
col sta http popu 模式 att font 註意 學習 【字符串操作】 Tcl的精髓在於對字符串的處理,非常多函數非常實用。特別是正則表達式。以下列出其經常使用的函數. l sting index: --> 索引 l sting rang
Django學習之全域性變數
首先說說什麼叫全域性變數,我們經常在html中使用{{ var }}這樣的模板變數,這些變數是我們在檢視函式中 提前定義好的變數,通過render()等方法傳遞到模板中。 但是,還有一類變數,我們並沒有在views.py中定義,也能在html中使用該變數,像這樣的變數,就叫做 全域性變數。 下面來看看
theano學習之Shared變數
Shared 變數,意思是這些變數可以在運算過程中,不停地進行交換和更新值。 在定義 weights 和 bias 的情況下,會需要用到這樣的變數。 import numpy as np import theano import theano.tensor as T #--
吳恩達機器學習之多變數線性迴歸實現部分
C++實現梯度下降法 “linear_regression.h” //多變數線性迴歸模型 struct elem_var2 { double y; double* x; //用陣列傳入自變數資料(x[0]=1,便於之後的計算) }; class var2
吳恩達機器學習之多變數線性迴歸理論部分
本部落格主要參考此部落格:戀雨心 一.Multiple Features — 多維特徵 相對於單變數線性迴歸模型,多變數線性迴歸模型適用於處理多個變數/特徵。 對比: 以之前我們介紹的單變數線性迴歸模型為例: 用房屋面積x預測房子價格y。 現在我們對房價模型增加更多的特徵,例如房間
吳恩達機器學習之單變數線性迴歸實現部分
C++實現 程式碼實現 “linear_regression.h” //單變數線性迴歸模型 struct elem_var1 { double x, y; //訓練集元素資料:自變數、因變數 }; class var1_lin_reg { p
吳恩達機器學習之單變數線性迴歸理論部分
理論部分 1.方程形式 在進行資料處理過程中,有時資料影象可擬合成單變數線性函式,即 2.如何擬合 此時,我們雖知道擬合函式的形式,但如何擬合仍是個問題,怎樣擬合可以最接近實際資料情況呢? 最小二乘法 此時我們引入代價函式這個概念 代價函式 接下來我們來分析如何
shell學習之shell變數
shell指令碼 shell是一個用c語言編寫的程式,是使用者用來操作linux系統的語言,俗稱命令列。 我的第一個shell指令碼 新建一個文字,將其命名為test.sh。在文字中編寫程式碼: #!/bin/bash echo “hello wang” 在test.s
記錄Python學習之路----------------變數及簡單資料型別
在開頭先說明Python3在geany下關於中文註釋和中文程式碼,在開始一個Python程式時,在程式開頭輸入以下程式碼, #-*-coding:utf-8-*- #-*-coding:GBK-*- print("你好,Python!") 就像上圖程式碼所示。還要記住Py
matlab學習之persistent變數的使用
persistent Define persistent variable. persistent X Y Z defines X, Y, and Z as variables that are local to the function in which they are declare
Python學習之路-----變數的引用
基本資料型別的引用 在Python中定義一個數據便在記憶體中開闢一片空間來儲存這個變數的值,這塊已經被分配的記憶體空間便會有一個記憶體地址。訪問這塊記憶體需要用到變數名,變數名實際儲存的是變數的地址在記憶體中的地址,但是使用print()函式得到的確實這塊記憶體
機器學習之——多變數線性迴歸
在之前的部落格中,描述過單變數線性迴歸(Linear Regression with One Variables)的模型,這次來分享一下多變數線性迴歸模型(Linear Regression wit
matlab學習之persistent變數、isempty()函式的使用
1.persistent 作用:定義persistent變數; 用法:persistent X Y Z 注: (a) 將在函式中宣告的區域性變數儲存到記憶體中,供以後呼叫該函式使用。定義的變數類似全域性變數會一直存在記憶體中,但不同的是persistent變數只能被所被定
C++學習之:變數的儲存類別
在c++中,每個變數有兩個屬性:型別:變數所儲存的資料型別(如int、double、char);儲存型別:變數所儲存的區域(atuo、register、extern、static)變數的作用域決定了變數的有效範圍。變數的儲存類別決定了變數的生存期限。在計算機中,記憶體被分成不
Python學習之路-變數、字串、函式
目錄 變數和型別 條件判斷 迴圈控制 函式 變數和型別 基本變數型別 整數 浮點數 字串 布林值 空值 函式 模組 型別* 自定義型別 變數定義 變數儲存在記憶體中的值。這就意味著在建立變數時會在記憶體中開闢一個空間。 基於變數的資料型別,
機器學習之單變數線性迴歸(Linear Regression with One Variable)
1. 模型表達(Model Representation) 我們的第一個學習演算法是線性迴歸演算法,讓我們通過一個例子來開始。這個例子用來預測住房價格,我們使用一個數據集,該資料集包含俄勒岡州波特蘭市的住房價格。在這裡,我要根據不同房屋尺寸所售出的價格,畫出我的資料集: 我們來看這個資料集,如果你有一個朋
TCL學習之info命令
這篇文章主要講一下info指令的相關用法。 1.info命令列表 該命令使用的匹配式規則和string match 一致,並且如果不適用匹配式,返回所有的項。 序號 命令 描述 1 info comm
JavaScript的學習之區域性變數和區域性函式
JavaScript-區域性變數和區域性函式 一、區域性變數和全域性變數 首先,我們先來了解一下區域性變數和全域性變數的定義 區域性變數:在函式內,使用var定義的變數 全域性變數:在函式外定義的變數和在函式內不使用var定義的變數 需要注意的是: 如果區域性