autohotkey2.0勉強中(翻訳)その5~変数編~
最終更新日: 2017/10/30
目次
はじめに
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
変数編
変数の型
- 変数やコマンドの引数として使われる値は、すべて文字列として保持される
- 明示的に変数の型を定義する必要はなくて、任意の変数に文字列、整数、浮動小数点数、またはオブジェクトへの参照を代入することができる
- また、数値は必要に応じて文字列に自動的に変換される
- 変数の型を判別したい場合はType関数を使用することで判別することができる
- 値が特定のフォーマットの場合、整数、小数、日付時刻として計算などで使うことができる
- どのような書式が 各コマンドが対応(原文:出力)する整数・小数の文字列表現フォーマットなのかは、SetFormatコマンドで設定できる
変数のスコープと宣言
- 関数のローカル変数を除いて、すべての変数はグローバル変数として扱われる
- 関数内で定義された変数を除いて、変数をグローバル宣言する必要はない
- 変数を使用することによってその変数が存在するようになる(定義されたことになる、使用できるようになる)
- スクリプト起動時に、各変数の値はemptyまたはblankでスタートする
変数の名前
- 変数名は大文字と小文字は区別されない(たとえばCurrentDateはcurrentdateと同じ)
- 変数名は最大253文字で、文字、数字、アンダースコア、ASCII以外の文字で構成され、変数名は数字で始めることはできない
予約語
以下の単語は演算子として、もしくは制御フロー文の名前として予約または使用されているため、変数名として使用できない
まあつまり既にこれらの名前はahkに使われてるから使えないってこと
また、関数、クラス、およびウィンドウグループでも変数と同じ検証を使用するため以下の単語が使えない
予約語の一覧(abc順)
and | break | catch | continue | else |
Finally | For | Gosub | Goto | If |
in | is | Loop | LoopFile | LoopParse |
LoopRead | LoopReg | new | not | or |
Return | Throw | Try | Until | While |
変数への値の代入(格納)
- 変数に値を代入するには「:=」の後に数字、引用符付き文字列、または他のタイプの式を書く
- ahk2からは「=」は使えず、「:=」に統一された←ここ重要
ex: 代入の例 Var := 123 ;数値*123*の代入 Var := "Var" ;文字列*Var*の代入
- 値が割り当てられていない変数には、デフォルトで空(blank/null)の文字列が含まれている
変数に割り当てられたメモリの解放
ex: Var := "" という風に空の値を割り当てることで、割り当てられたメモリを開放できる
- 変数には、コマンドの出力変数として間接的に値を割り当てることもできる
関数の出力変数を用いて間接的に変数への代入を行う
ex: アクティブウィンドウのタイトルを関数の出力変数*Title*に代入 WinGetTitle *Title*, A
- 変数が整数の場合、64ビット整数(long)相当の値が扱える
- 変数が少数の場合、double値相当の値が扱える
- 変数とは別に、環境変数(後述)も扱うことが出来る(どこからこれ持ってきたんだろう?)
- EnvSetコマンドで環境変数に代入する
- この環境変数は、Runコマンドなどで起動したプログラム内から参照できる
- 変数の展開では、通常の変数も環境変数も展開できるが、未定義の変数は長さ0の文字列に展開される
- 1変数の容量の上限は64KBである(#MaxMem指令で変更可能)
- 組み込み変数は「組み込み変数」を参照
変数の値(内容)を取得する
- 変数の内容を文字列に含めるには、変数名をパーセント記号「%」で囲めばいい
ex: MsgBox、変数Varの値は%Var%です MsgBox( "変数Varの値は%Var%です" )
- また、パーセント記号「%」は式の変数参照(引用符付き文字列以外、式内など)では省略していい
ex: MsgBox( "XとYの合計は(X + Y)です" )
エスケープシーケンス(エスケープ処理)
- ファイルパスの「\」のエスケープの必要をなくすため、エスケープ文字は「`」(Shift+@)になっている
- 以下に示すエスケープシーケンスが使える
- それ以外の文字をエスケープした場合、その文字自身になる(例:「`x」→「x」)
EscapeChar指令でエスケープ文字を変更できるらしい
- 任意のコマンドの最初のカンマを省略することができる
- (最初の引数が空白の場合や::=などの代入演算子で開始する場合、またはコマンドが継続セクションの一番上にある場合を除く)
- 例外1:MsgBox内のカンマはエスケープする必要はない
- 例外2:コマンドの最後の引数のカンマはエスケープする必要はない
エスケープシーケンス一覧
- コマンドの区切りと区別するため、エスケープが必要
- なお、コマンドの最後の引数内では、文字としてのカンマであることが自明なため、カンマをエスケープする必要は無い
- `; 「;」で、半角スペースかTab文字の次に来る場合のみ、コメントの開始記号と区別するためにエスケープする必要がある
- `:: 文字列「::」(コロン二つ)ホットストリングなどで使用
- `% 「%」(パーセント記号)
- `n 改行(LF/0x0A)
- `r 復帰(CR/0x0D)
- `t Tab文字(0x09)
- `v 垂直Tab(0x0B)
- `b BackSpace文字(0x08)
- `a Bell文字(0x07)
- `f 改ページ(0x0C)
- `` 「`」自身なんかバックスラッシュ二個と同じ意味合いをもつらしい
- `, 「,」(カンマ)の文字 プログラム最後のカンマとMsgBoxではエスケープしなくていい
- `"または`' 一重引用符と二重引用符は同じ意味を持つが、一重引用符で囲まれた文字列の中では二重引用符を使用するとそのまま二重引用符が扱える、説明しにくいので以下の例を見て
ex:一重引用符の中に二重引用符を用いる例で、以下の二つは同じ結果 Var := "The color \`"red\`" was found." ;「"」をエスケープ「\`"」して書いた場合 Var := 'The color "red" was found.' ;「'」で囲んでいるので中にある「"」はエスケープしなくてもよい
Sendモードにおけるエスケープシーケンス
Sendコマンドまたはホットストリングをデフォルト(非raw)モードで使用すると、{} ^!+#などの文字は特別な意味を持つため、
これらを文字通り使用するには、中括弧で囲む
ex: Send {^} {!} {{}