配列
オブジェクトを利用した配列[編集]
Object() をコールすることで配列を作成することができる。
; 要素が空の配列を作成する
Array := Object(); 配列にデータを格納する
Loop, Read, C:\Guest List.txt; このループでファイルの各行をとりだす
{ Array.Insert(A_LoopReadLine); 行を配列の要素として格納
}; 配列内の要素を読み出す
; Loop % Array.MaxIndex() ; これは旧形式のやり方
For index, element in Array; こちらの方法を推奨
{; Loop では、インデックスは1で始まる連続した数値でなければならない。
; Forを利用すると、インデックスは数値である必要はなくなり、
; 配列内の要素も配列本体を参照しなくても取得ができるようになる。
MsgBox % "Element number " . index . " is " . element }
上記の例はオブジェクトの機能のごく一部を利用している。他に配列には、各要素を格納・取得・削除・列挙する等といった機能がある。オブジェクトでは整数だけでなく、文字列やオブジェクトも配列のキーとして利用できる。オブジェクトには他オブジェクトを格納したり、関数の引数や戻り値としても利用できる。また、オブジェクトには関数を割り当てて機能拡張もすることができる。
Insert()
で要素を追加することや、配列要素を列挙するにはそれぞれの用法があり、他の処理系などで配列を利用したことがあるユーザにはこちらの方が馴染みがよいかも知れない。
; 配列は利用前に必ず初期化する
Array := Object(); Array%j% := A_LoopField
Array[j] := A_LoopField; Array%j%_%k% := A_LoopReadLine
Array[j, k] := A_LoopReadLine ArrayCount := 0 Loop, Read, C:\Guest List.txt { ArrayCount += 1; Array%ArrayCount% := A_LoopReadLine
Array[ArrayCount] := A_LoopReadLine } Loop %ArrayCount% {; element := Array%A_Index%
element := Array[A_Index]; MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
MsgBox % "Element number " . A_Index . " is " . Array[A_Index] }
上の例の ArrayCount は利便性の面で残してあるが、「Array.Count := n
」のように配列そのものに格納させたり、それ自体を無くして「Array.MaxIndex()
」を参照する、という方法もできる。
配列のインデックスが1から始まる連続した数値なら「Loop, % Array.MaxIndex()」としてしまうこともできる。
擬似配列[編集]
v1.0,90,00以前のAutoHotkeyには配列型変数は無く、 var1, var2 ... varN
のように末尾の数字を変えた変数の集合を擬似的に配列として取り扱う。またいくつかのコマンドはこの擬似配列を利用して不特定数の値をあつかうようになっている。
StringSplitやWinGetなどのコマンドでは、配列の代わりに最後に数字の付いた変数に結果を代入する。変数名の後ろに要素番号(1...要素数)を足した名前の変数が配列の各要素となる。要素数は、WinGetでは指定した名前の変数、StringSplitでは指定した名前に 0
をつけた名前の変数に代入される。他にGuiControlGet の座標取得や RegExMatch でのサブマッチ文字列などもこの擬似配列を利用している。
この擬似配列はあくまでも擬似的で各変数は独立したものであり、それぞれをリンクした機能があるわけではない。擬似配列の全要素に対して処理を行いたい場合は、StringTrimLeftコマンドで元の変数名の指定にループ変数を埋め込むことで各要素を取り出せる。
コマンドの出力結果としての擬似配列以外で、スクリプト内で擬似配列を作成する場合は代入演算子(:=
)を利用する。
Array%j% := value
多元の擬似配列を作る場合は、変数名の中に各次元の添え字を区切る文字を指定する必要がある。
Array%j%_%k% := value
以下の例では、テキストファイルからデータを読み出して一連の同一接頭辞を持つ変数に代入を行い、擬似配列を作成・利用する例である。
; 擬似配列の作成:
ArrayCount = 0 Loop, Read, C:\Guest List.txt; このループでは
{ ArrayCount += 1; 要素数のカウントを行う
Array%ArrayCount% := A_LoopReadLine; 読み出した行を配列の要素として変数に代入する
}; 擬似配列からデータの読み出し:
Loop %ArrayCount% {; 以下の代入(:=)は配列の要素の取り出しを行っている:
element := Array%A_Index%; A_Index は組み込み変数
; パラメタの接頭辞として "% " を利用すると「式」が利用できるようになる
MsgBox % "Element number " . A_Index . " is " . Array%A_Index% }
似たような事例として、一連のバイナリフォーマットの数値の NumPut() / NumGet() を利用しての読み書きがある。
これはパフォーマンスや利用メモリ量削減といったメリットがある。