FANDOM


Scripters_cafeログ


08/08/16 編集

state構成のパターンの話から、設定ファイルを読み込む際の処理の話になりました。

よく使われる設定の記述方法として、「名前=値」という書き方で設定名に対する値を指定する記法があります。 この記法の設定ファイルから名前と値を取得する場合、LSLではいくつかのやり方があります。


llParseString2Listを使う 編集

llParseString2Listを使うと、文字列に対して指定した文字で分割した結果をリスト変数として取得できます。

たとえば「名前=値」という記法の場合、= で分割すればよさそうです。

parsed_value = llParseString2List( data, [ "=" ], [] );

ただし、この方法だと「値」の側に=が含まれている場合、そこもすべて分割して別々のリスト要素になってしまいます。そのばらばらになったものを、再度=で結合して1つの文字列に戻すという方法もありますが、スマートな方法とは言えません。

したがって、llParseString2Listが使えるのは「値に=(区切り文字)が含まれない」という前提条件が成り立つ場合のみ、ということになります。

この前提条件が成り立たないような汎用的なスクリプトを作成する場合は、次以降の方法を使う必要があります。


★llParseString2Listでは、一時的にデータをリスト型変数に格納するため、処理コストがやや大きいというデメリットもあります。


llSubStringIndexとllGetSubStringを使う 編集

2つ目の方法は、文字列中の特定の文字の位置を取得するllSubStringIndexを使って先頭の=の位置を求め、その位置とllGetSubStringを使用して「=の前の文字列」「=の後の文字列」を抽出する方法です。

index = llSubStringIndex( data, "=" );
name = llGetSubString( data, 0, index -1 );
value = llGetSubString( data, index + 1, -1 );

LlGetSubStringの2番目、3番目のパラメータには「-1」を使用できます。-1を使うと、「末尾文字のインデックス」を計算せずに指定することができます。

このようにすることで、=の前と後ろの文字列をストレートに取得することができます。


ただしこの方法でも問題があります。 =の後ろが空文字列だった場合、valueに代入される結果は直感とは異なるかもしれません。


default {
    touch_start(integer total_number) {
        string test = "name=";
        integer index;
        index = llSubStringIndex( test, "=" );
        llOwnerSay( llGetSubString( test, index + 1, -1 ) );
    }
}

結果:

Object: name=

このように、対象文字列全体が返ってきてしまいます。 =が文字列の末尾にあるのかどうかで条件分岐させるなど、回避方法はありますが、次に挙げるllDeleteSubStringを使う方法もあります。


値の取得にllDeleteSubStringを使う 編集

llDeleteSubStringは、llGetSubStringと対になる関数で、指定した範囲を除外した文字列を取得できます。

この関数を使うと、先の例を以下のように書き換えるだけで、=の後が空の場合でもうまく動作するようにできます。

index = llSubStringIndex( data, "=" );
name = llGetSubString( data, 0, index -1 );
value = llDeleteSubString( data, 0, index );

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki