2017/03/01(水) [n年前の日記]
#1 [autohotkey] AutoHotkeyをまだまだまだ勉強中
AutoHotkeyは言語仕様がなんとなく酷い気がする。ところどころにトラップが仕込んであるというか。いやまあ、AutoHotkeyを言語と呼んでいいのかどうかも分からないけど。Python や Ruby って、ちゃんと作られてるんだなあと改めて感心。AutoHotkeyに比べると、HSPすら美しい言語仕様に思えてくる。
おそらく後から色々仕様が追加されて、過去に書かれたスクリプトとの互換性を重視した結果こうなったのかなと思わないでもなかったり。
おそらく後から色々仕様が追加されて、過去に書かれたスクリプトとの互換性を重視した結果こうなったのかなと思わないでもなかったり。
◎ 名前を間違えてた。 :
「AutoHotKey」じゃなくて「AutoHotkey」なのですな。前者と思い込んでた。他の日記ページを修正。
◎ 三項演算子がよく分からん。 :
; 三項演算子のテスト a=D ; OK b := a="D" ? 1 : 0 ;=> 1 MsgBox % b ; NG b := a=D ? 1 : 0 ;=> 0 MsgBox % b ; NG b = a=D ? 1 : 0 ;=> a=D ? 1 : 0 MsgBox % b ExitApp ~!Q:: ExitApp二番目の書き方をしてしまって、思ったように動かなくてハマったり。
◎ 配列の種類が2つあるような気がする。 :
AutoHotkeyには、配列の種類が少なくとも2つあるようで。
- StringSplitで配列にした場合。
- Object() を配列のように使った場合。
; StringSplit を利用して文字列を分割、配列にする例 ; 結果は、Object を使った配列相当とは違う種類の配列になる模様 inputvar := "Pen Pineapple Apple Pen" StringSplit, outvar, inputvar, %A_space% ; Display the length of the array. 配列の長さを表示 MsgBox % outvar0 ; OK MsgBox % outvar.MaxIndex() ; NG MsgBox % outvar.length() ; NG ; Display elements of an array. 配列の要素を表示 MsgBox % outvar2 ; OK MsgBox % outvar[2] ; NG
; Loop, Parse を利用して文字列を分割、配列にする例 ; Objectを配列相当として扱う inputvar := "Pen Pineapple Apple Pen" outvar := Object() Loop, Parse, inputvar, %A_space% outvar.Insert(A_LoopField) ; Display the length of the array. 配列の長さを表示 MsgBox % outvar0 ; NG MsgBox % outvar.MaxIndex() ; OK MsgBox % outvar.length() ; OK ; Display elements of an array. 配列の要素を表示 MsgBox % outvar2 ; NG MsgBox % outvar[2] ; OK
◎ Object()を連想配列として使う。 :
Object()を使うと連想配列っぽいことができるようで。
; スペース区切りの文字列を分割してObject()を連想配列として扱いつつ記録していく例 ; Object() へアクセスする記述もテスト ks=a b c d e `, - ks := Trim(ks, " ") cnt = 9000 lst_a := Object() lst_b := Object() ; like StringSplit Loop, Parse, ks, %A_space% { k=%A_LoopField% v=%k% lst_a.Insert(k, v) ; a: "a" lst_b.Insert(k, cnt) ; a: 9000 cnt+=1 } For k, v in lst_a { If lst_b[k]=9002 { s := k . " : " . lst_b[k] MsgBox % s } }
[ ツッコむ ]
以上です。