2013年9月3日 星期二

AutoIt 學習筆記 : 基本語法

這陣子可能又要修改機器人程式, 有一段時間沒用到 AutoIt 了, 所以今天把以前胡亂抄寫的筆記稍做整理, 順便複習一下.

一. 變數與常數 :
  1. AutoIt 的變數與常數名稱須以 $ 開頭, 只能使用英數字與底線, 不分大小寫 (常數名稱建議都用大寫以利識別), 所以 $var 與 $Var是一樣的. 注意不可以跟內建函式名稱相同. 變數可以先宣告再賦值, 也可以宣告同時賦值, 多個變數可以同時在一行宣告並賦值, 例如 :
    Dim $a                       ;宣告變數 (一定要有修飾詞)
    $a=1                          ;先宣告再賦值
    Dim $a=1                   ;宣告同時賦值
    Dim $a, $b, $c            ;同一行宣告多個變數 (一定要有修飾詞)
    Dim $a=1, $b, $c=3   ;同時宣告多個變數並賦值 (一定要有修飾詞)
    注意, 下列指令會有執行錯誤 :
    $a=1, $b=2, $c=3       ;沒有加修飾詞
    $a                               ;沒有加修飾詞
  2. 常數要用 Const 關鍵字宣告, 且其值不可更改, 否則執行錯誤. 例如 :
    Global Const $PI=3.14159
    ** 使用 Const 就是為了避免數值不小心被改變 (因重複宣告同名變數)
    ** 常數不能重複宣告, 否則執行錯誤 (變數是可以重複宣告的)
  3. 變數應該用 Dim/Local/Global 三個關鍵字宣告其有效範圍 (scope) :
    Dim : 宣告之變數如果在全域範圍中不存在, 那麼就是 Local; 否則就是 Global
    Local : 強制宣告變數之有效範圍為 Local
    Global : 強制宣告變數之有效範圍為 Global (即使在函數內宣告)
    ** 建議明確使用 Local/Global 宣告有效範圍, 不要使用 Dim 讓直譯器判斷
    ** 若未使用 Dim/Local/Global 修飾詞, 則必須在宣告之同時賦值, 否則會執行錯誤.
    ** 未宣告修飾詞之變數, 在程式最外層預設為 Global; 在函式或 If/For/While 等結構內為 Local
  4. 執行過程中常要輸出變數值, 以檢驗演算結果是否正確, 可用下列兩種輸出方式 :
     (1). 輸出到 STDOUT : ConsoleWrite("$Str=" & $Str & @CRLF)  
     (2). 輸出到訊息框 : MsgBox(0, "標題", $Str)  
    讀取輸入到變數中可用 :
    從 InputBox 讀取輸入 : $ID=InputBox("標題", "提示語")
  5. AutoIt與Javascript一樣屬於弱型態語言, 變數之資料型別於賦值時決定, 且可以隨時更換型別, 例如 :
    Local $x= “abc”   ;宣告 $x 為字串, 存入 “abc”
    $x=123                ; $x 因賦值為123而變成數值

二. 註解 :
  1. 單行註解 :
    AutoIt使用分號當作單行註解符號, 所有跟在分號後面的字串都會被直譯器或編譯器忽略. 但是字串中的分號為例外, 就只是個分號而已. 例如 :
    ;此行是註解
    $string=";這不是註解, 是字串"
  2. 段落註解 :
    若註解超過一行, 則可以用 #cs 與 #ce包圍起來, 例如 :
    #cs
    這是段落註解
    #ce
三. 敘述 :
  1. AutoIt 的敘述以跳行為結束. 
  2. AutoIt 敘述若太長時, 可用 “空白+底線” (“ _”) 表示跨到下一行繼續. 例如 :
    $Str=“蘋果 iPad2 _
             iPod and Itune”
    ** 注意, 底線後面不可再加任何註解, 否則會執行錯誤. 
四. 資料類型 :

      AutoIt 有五種資料類型, 但因為是弱型態語言, 所以宣告變數時不用宣告型態 :
  1. 數值 :
    (1). 10進位數值 : 整數例如 123, -123, 實數例如 1.23, -1.23, 1.23e5 (科學表示法)
    (2). 16進位數值 : 以前綴 0x 為首, 例如 0x1cf, 0x236b (最大只能表示 32 位元之整數)
    (3). 檢查變數是否為數值可呼叫函式 IsNumber(), IsInt(), IsFloat()
  2. 字串 :
    (1). 字串內容必須用單引號或雙引號括起來, 例如 : ‘Hello’ 或 “Hello”
    (2). 字串內容含有引號時, 必須使用混合使用單引號與雙引號, 例如 : “I am ‘smart’”
    (3). 字串與數值做數學計算時, 會呼叫 Number() 函數將文字轉成數值, 若其內含有非數值
           字元, 則將傳回0進行計算. 例如 10 * “abc3” -> 0 而 10* “3” -> 30
    (4). 檢查變數是否為字串可呼叫函式 IsString()
    (5). 字串的串接使用 & 符號
  3. 布林值 :
    (1). 布林值只有兩個 : true 或 false, 例如 : Dim $b1=true, $b2=false
    (2). 布林值通常使用於三個邏輯運算子 : And, Or, 以及 Not, 例如 :
           Dim $b3=$b1 And $b2
    (3). 布林值與數值, 文字混合運算時會以下列規則轉換 :
           a. 布林值與數值做數學計算時 : true -> 1, false -> 0
           b. 布林值與數值做邏輯運算時 : 1 -> true, 其他數值 -> false
           c. 布林值與文字串接時 : true -> “True”, false -> “False” (注意首字母大寫)
    (4). 檢查變數是否為布林值可呼叫函式 IsBool()
  4. 二進位值 :
    (1). 二進位值可以呼叫 Binary() 函式取得, 顯示其值時會以16進位數值表示
          例如 : $bin=Binary(“abc”) -> 0x616263
    (2). 檢查變數是否為二進位值可呼叫函式 IsBinary() 
  5. 指標 (pointer) :
    (1). 指標是一個記憶體位址, 例如呼叫 WinGetHandle() 函式時就會傳回指定視窗之控制碼
    (2). 指標值大小依 AutoIt32 或 AutoIt64 分為 32/64 位元

五. 常數與變數 ($ 號) :
  1. AutoIt的常數與變數都以 $ 開頭, 不區分大小寫, 所以 $VAR 與 $var 是一樣的
  2. 常數或變數名稱只能使用字母, 數字, 以及底線 (可以用數字開頭, 常數名稱建議用大寫)
  3. 常數要用 Const 關鍵字宣告, 且其值不可更改, 否則執行錯誤. 例如
    Global Const $PI=3.14159
    ** 使用 Const 就是為了避免數值不小心被改變 (因重複宣告同名變數)
    ** 常數不能重複宣告, 否則執行錯誤 (變數是可以重複宣告的)
  4. 變數應該用 Dim/Local/Global 三個關鍵字宣告其有效範圍 (scope) :
    Dim : 宣告之變數如果在全域範圍中不存在, 那麼就是 Local; 否則就是 Global
    Local : 強制宣告變數之有效範圍為 Local
    Global : 強制宣告變數之有效範圍為 Global (即使在函數內宣告)
    ** 建議明確使用 Local/Global 宣告有效範圍, 不要使用 Dim 讓直譯器判斷
    ** 如果沒有使用 Dim/Local/Global 修飾詞, 則必須在宣告之同時賦值, 否則執行錯誤.
    ** 未宣告修飾詞之變數, 在程式最外層預設為 Global; 在函式或 If/For/While 等結構內為Local
  5. 變數可以先宣告再賦值, 也可以宣告同時賦值, 多個變數可以同時在一行宣告並賦值 :
    Dim $a         ;宣告變數 (一定要有修飾詞)
    $a=1           ;先宣告再賦值
    Dim $a=1       ;宣告同時賦值
    Dim $a, $b, $c   ;同一行宣告多個變數 (一定要有修飾詞)
    Dim $a=1, $b, $c=3   ;同時宣告多個變數並賦值 (一定要有修飾詞)
    注意, 下列指令會有執行錯誤 :
    $a=1, $b=2, $c=3  (沒有加修飾詞)
    $a              (沒有加修飾詞)
  6. AutoIt與Javascript一樣屬於弱型態語言, 變數之資料型別於賦值時決定, 且可以隨時更換.
    Local $x= “abc”  ;宣告 $x 為字串, 存入 “abc”
    $x=123         ; $x 因賦值為123而變成數值

六. 運算子 :

AutoIt 共有 22 個運算子, 分為 5 類 :
  1. 算術運算子 :
    算術運算子共有 + - * / ^ 共五個, 特殊之處是 AutoIt 納入了乘方 (冪次) 運算子 ^, 例如 :
    MsgBox(0,"乘冪",2^10) ; => 輸出 1024
    算術運算子共有 + - * / ^ 共五個, 特殊之處是 AutoIt 納入了乘方 (冪次) 運算子 ^, 例如 : MsgBox(0,"乘冪",2^10) ; => 輸出 1024
    除以 0 會得到 1.#INF (無窮大), 例如 :
    MsgBox(0,"除以零",2/0) ; => 輸出 1.#INF
    運算結果若為大於 1 之無窮小數, 則會取小數點後若干位數使得整數位數 + 小數位數=15 位數, 例如 :
    12/7 => 1.71428571428571; 120/7 => 17.1428571428571
    運算結果若為小於 1 之無窮小數, 則會取小數點後 15 位數, 例如 :
    2/7 => 0.285714285714286
    對於其他較複雜之數學運算, AutoIt 使用數學函式來處理.
  2. 文字串接運算子 :
    AutoIt 使用 & 運算符來串接字串, 例如 :
    "This book is " & "mine" -> "This book is mine"
    當字串與數字串接時, 數字會被轉換成文字再串接, 例如 :
    "$" & 120 -> "$120"
  3. 指派運算子 :
    指派運算子有6個, 除了 = 之外, 再加上與四則運算以及文字串接運算子結合者 :
    =, +=, -=, *=, /=, &=
    結合指派運算子的左邊運算元必須為變數, 右方運算元可以為常數或變數. 將左右兩運算元運算後之結果再指派給左方運算元變數, 例如 :
    Local $x += $y  ;將 $x 與 $y 相加之和再指派給 $x
  4. 比較運算子 :
    比較運算子共有 7 個 :  > < >= <= == = <> (不等於), 其運算結果為布林值 true/false
    比較特殊的是, AutoIt 有兩個相等比較運算子 :  =  (不分大小寫)  == (區分大小寫), 只在英文字串比較時有差別. 例如 : 
    $str= “ABC”
    If $str= “abc” Then -> 結果為 true
    If $str== “aBC” Then -> 結果為 false
  5. 邏輯運算子 :
    邏輯運算子只有 3 個 : AND, OR, NOT 用於布林運算元.
    如果要用到 XOR 運算, 必須使用 ((NOT $A) AND $B) OR ($A AND (NOT $B)) 等效式
運算子的優先順序 : 運算式依下列順序執行, 但可以利用小括號改變順序 :
  1. NOT (邏輯否定)  
  2. ^ (冪次)  
  3. * / (乘除)  
  4. + - (加減)  
  5. & (字串串接) 
  6. < > <= >= = <> == (比較)  
  7. AND OR (邏輯且/或, 且先於或)

七. 程式除錯 :  

程式開發階段常需要讀取輸入或輸出變數來偵錯 :
  1. 變數輸出 :
    執行過程中常要輸出變數值, 以檢驗演算結果是否正確 :
    輸出到 SciTE 底下的 Console :
    ConsoleWrite("$Str=" & $Str & @CRLF)    ;寫入STDOUT (不會跳行)
    輸出到 MsgBox :
    MsgBox(0, "標題", $Str)                 ;寫入圖形介面
    輸出陣列變數可匯入使用者定義函式庫 Array.au3 後呼叫 _ArrayDisplay() :
    #include <Array.au3>
    Local $a[3]=[1,2,3]
    _ArrayDisplay($a, "陣列內容")
  2. 讀取輸入 :
    從 STDIN 讀取輸入 : ConsoleRead 必須放在迴圈中, 且必須編譯成 .exe
    Local $data
    While True
         $data &= ConsoleRead()
         If @error Then ExitLoop
    WEnd
    從 InputBox 讀取輸入 :
    $ID=InputBox("標題", "提示語")
          ** ConsoleWrite 與 ConsoleRead 屬於內建函數 (File/Directory/Disk)


沒有留言 :