Aug 31, 2009

NSISで"string".split(" ").forEach(...) みたいなことをやりたい(文字列を分割してそれぞれの要素に対し処理を実行)

INIファイルから文字列を読み込んで、それを空白(カンマ、コロン、パイプ、など何でもいいけどとにかく区切り文字)で区切ってループ回す、ということをNSISでやろうと思ったらどうやるのがスマートなんだろうか。

とりあえず見よう見まねと試行錯誤でこんな感じに書いたら一応期待通りに動いた。

!include "LogicLib.nsh"
!include "WordFunc.nsh"
!insertmacro WordFind

(中略)

Var STRING
Var PART
Var INDEX

(中略)

StrCpy $STRING "aaa bbb ccc ddd"
StrCpy $INDEX "0"

${While} 1 == 1
  IntOp $INDEX $INDEX + 1
  ${WordFind} $STRING " " "+$INDEX" $PART
  ${If} $INDEX > 1
    ${IfThen} $PART == $STRING ${|} ${Break} ${|}
  ${EndIf}
  Call MyFunction
${EndWhile}

${WordFind}の第1引数が元の文字列、第2引数が区切り文字で、第3引数に「その文字で区切った後の配列の何番目の要素か(添え字は1から始まる)」を指定すると、第4引数の変数に要素の内容に相当する文字列が格納される。0番目あるいは配列の長さ(に相当するもの)よりも大きな数字を第3引数に渡すと、返り値は元の文字列そのままとなるので、これを脱出条件としてループさせてみた。

9月2日追記。配列(のようなもの)の長さが1つの時のことを考慮してなかったので修正した。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能