AutoHotKeyには変数の型はなく、すべて文字列として保持されます。しかし変数が数字 (小数点を含む) だけの場合には、数式や比較処理のときに数値と解釈されます。
a := 2
b := "3"
c := a * b
MsgBox, % c ; 6
エスケープ文字は既定でバッククォート (`) となっており、バックスラッシュ (\) ではありません。
小数点を持つ場合は浮動小数点数として扱われ、それ以外は整数となります。式ではいずれかの値が浮動小数点数ならば、結果は浮動小数点数となります。
a := 3 / 2
MsgBox, % a ; 1.500000
「0x」の接頭辞を付けることで16進数と認識されます。
a := 0xA b := a c := a + 0 MsgBox, %b% ; 0xA と表示 MsgBox, %c% ; 10 と表示
型としての論理型はありませんが、「true」「false」の2つが組み込み変数として用意されています。
a := true MsgBox, %a% ; 1 と表示 a := !a MsgBox, %a% ; 0 と表示
変数の名前では、大文字と小文字は区別されません。
関数外で定義された変数は、グローバルなスコープを持ちます。Local and Global Variables
関数内からグローバル変数を参照するには、先にそれへの参照をglobalキーワードで宣言します。これを怠ると、関数内でのローカル変数が新たに定義されることになります。
a := "A" ; グローバル変数 Func() { global a ; グローバル変数を参照するための宣言 b := "B" ; ローカル変数 }
変数は、それを定義する処理が実行された時点で定義されます。
Exit X := "ABC" ^a:: msgbox, %X% ^b:: X := "OK"
最初に^aのスクリプトを呼び出しても、何も表示されません。次に^bを呼び出してから再度^aを呼び出すと、"OK"と表示されます。
スクリプト パラメータ以外には、コロン イコール ( := ) を使用します。この演算子は式の評価結果を代入します。
MyNumber := 123 MyString := "ABC" ; 文字列はダブルクォーテーション ( " ) で囲む CopyOfVar := Var ; 変数はパーセント ( % ) で囲まないVar := expression
関数の戻り値以外ではイコール ( = ) でも代入を行えますが、その使用には注意が必要です。「:=」と同様の結果を得るには、
MyNumber = 123 MyString = ABC ; 文字列はダブルクォーテーション ( " ) で囲まない CopyOfVar = %Var% ; 変数はパーセント ( % ) で囲むSetEnv
のようにする必要があります。これをまとめると、
:= | = | |
---|---|---|
数値 | 123 | |
文字列 | "ABC" | ABC |
変数 | Var | %Var% |
のようになります。
関数の戻り値には、必ず「:=」を使用します。「=」を使用すると、式ではなくただの文字列として評価されてしまいます。たとえば、
length = StrLen( "abc" )
のようにすると、変数lengthには「StrLen( "abc" )」が代入されます。
スクリプト パラメータで渡された値には、必ず「=」を使用します。通常の変数と同様に、
x := 1
とすると、数値の「1」が代入されてしまいます。よって「=」の構文で、
x = %1%
とする必要があります。
「:=」を使用するとダブルクォーテーションは文字列を示す記号と認識され、エラーとなります。
a := "A ; Error: Missing close-quote
よって必ず「=」を用います。
b = "A
Array := [Item1, Item2, ..., ItemN] Array := Array(Item1, Item2, ..., ItemN)Simple Arrays - Objects
array := [10,20,30] value := array[2] ; 20が格納される MsgBox, % array[2] ; 20と出力される
array := [10,20,30]
array.InsertAt(2,"A","B") ; 10,"A","B",20,30
array := [10,20,30]
array.Push("A","B") ; 10,20,30,"A","B"
array := [10,20,30] RemovedValue := array.Pop() ; arrayは、10,20 ; RemovedValueは、30
array := [10,20,30] RemovedValue := array.RemoveAt(2) ; arrayは、10,30 ; RemovedValueは、20
array := [10,20,30] Loop, % array.Length() MsgBox, % array[A_Index] ; 10,20,30とくり返し出力 For index, value in array MsgBox, % index "-" value ; 1-10,2-10,3-30とくり返し出力
array := [[10,20,30],[40,50,60]]
MsgBox, % array[2,1] ; 40と出力
Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ} Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ)Associative Arrays - Objects Associative Arrays - Arrays
array := {"A":10, "B":20} value := array["A"] ; 10が格納される MsgBox, % array["A"] ; 10と出力される
AutoHotkey_L以前は配列をサポートしないため、変数名を変数で表すという特殊な手段により実現します。
X := p%index%
このときindexの値が"1"だとすると、この式は
X := p1
となり、変数p1の内容が参照されます。多次元も同様に、
X := p%index1%_%index2%
のように複数の変数を使用します。Pseudo-Arrays - Arrays
式では変数はパーセントで囲みません。一方で文字列はダブルクォーテーションで囲みます。これは前述のコロン イコール ( := ) での用法と同じになります。
なお変数を配列として使用する場合には、変数をパーセントで囲みます。
v1.1.21以降では定数を要求されるとき、パラメータの最初に「%
」を付加することで式とみなされようになります。このとき「%
」だけでは機能せず、それにスペースまたはタブが続く必要があります。Force an expression - Variables and Expressions - Definition & Usage | AutoHotkey
それゆえ次のMsgBoxは、同一内容を表示します。
foo := "AA" bar := "BB" MsgBox, % "CC" . foo bar . "DD" MsgBox, CC%foo%%bar%DD
また式とすることで、演算結果をパラメータとして与えることも可能となります。
a := 2 b := 3 MsgBox, % a + b ; "5" と表示 MsgBox, %a% + %b% ; "2 + 3" MsgBox, % 2+3 ; "5" と表示 MsgBox, 2+3 ; "2+3"
演算子 | 説明 |
---|---|
%Var% | |
++ -- |
|
** | |
- ! ~ & * |
|
* / // |
|
+ - |
|
<< >> |
|
& ^ | |
|
. | 両辺を文字列として連結 (Concatenate) する
(演算子の両側にスペースが必要) |
> < >= <= |
|
= == <> != |
|
NOT | |
AND && |
|
OR || |
|
?: |
条件演算子 (conditional operator) |
:= += -= *= /= //= .= |= &= ^= >>= <<= |
|
, | |
mod() round() abs() |
a := 2
a += 3
a++
MsgBox, % a ; "6" と表示
x1 := 2 = 2 ; 1 x2 := 2 == 2 ; 1 x3 := -2 < 1 ; 1 x4 := 2 < -1 ; 0 x5 := 2 < 10 ; 1 x6 := 2 < "10" ; 0 a := "10" x7 := 2 < a ; 1
y1 := "A" = "a" ; 1 y2 := "A" == "a" ; 0 y3 := "A" < "B" ; 1 y4 := "A" > "B" ; 0
「=」は大文字/小文字を区別せず、「==」は区別して比較されます。一方で数値と解釈されるときには、この2つは同一です。ただしStringCaseSenseでOnと設定されていないならば、文字列でも同一となります。ところで「<>」「!=」にはこのような違いはなく、つねにStringCaseSenseの設定に依存します。