LlLinksetDataFindKeys/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: list llLinksetDataFindKeys( string pattern, integer start, integer count );

llLinksetDataFindKeys 関数は、pattern と一致するデータストア内の最大 count 個のキーのリストを返します。count が 1 未満の場合、start から末尾までのすべてのキーが pattern と一致する場合、それらが返されます。count から start を引いた値が一致するキーの数を超える場合、返されるリストは count よりも短くなります。ただし、start が一致するキーの数以上の場合は、ゼロ長のリストになります。リストはアルファベット順に並べられます。
データストア内のキーのリスト。を list で返します。

• string pattern 返すキーを記述する正規表現。
• integer start 返される最初のキー。
• integer count 返されるキーの数。

仕様

patternRegular expressionを参照.

サンプル

// Simple blacklist management.

integer gDialogChannel;
integer gDialogHandle;
integer gManagingBlocks;

startDialog(key person)
{
    gManagingBlocks = 0;
    gDialogHandle = llListen(gDialogChannel, "", person, "");
    llDialog(person, "\nSelect action", ["List blocks", "Add block", "Remove block"], gDialogChannel);
    llSetTimerEvent(60);
}

stopDialog()
{
    llSetTimerEvent(0);
    llListenRemove(gDialogHandle);
}

default
{

    on_rez(integer sp)
    {
        llResetScript();
    }

    state_entry()
    {
        gDialogChannel = (integer)(llFrand(-10000000)-10000000);
        llListen(PUBLIC_CHANNEL, "", NULL_KEY, "");;
    }

    timer()
    {
        stopDialog();
    }

    touch_start(integer nd)
    {
        key toucherKey = llDetectedKey(0);
        if (toucherKey == llGetOwner())
        {
            startDialog(toucherKey);
        }
    }

    listen(integer channel, string name, key id, string message)
    {

        if (llGetAgentSize(id) == ZERO_VECTOR)
        {
            return;
        }

        if (channel == gDialogChannel)
        {
            stopDialog();
            if (gManagingBlocks)
            {
                message = llStringTrim(message, STRING_TRIM);
                if ((key)message)
                {
                    if (gManagingBlocks == 1)
                    {
                        llOwnerSay("Addition request has been sent to the blacklist storage");
                        llLinksetDataWrite("blocklist:" + message, "1");
                    }
                    else
                    {
                        llOwnerSay("Removal request has been sent to the blacklist storage.");
                        llLinksetDataDelete("blocklist:" + message);
                    }
                }
                else
                {
                    llOwnerSay("The UUID '" + message + "' appears to be invalid.");
                }
                startDialog(id);
            }
            else if (message == "List blocks")
            {
                list blocks = llLinksetDataFindKeys("^blocklist:", 0, 0);
                integer listLength = llGetListLength(blocks);
                llOwnerSay("Blacklist items: " + (string)listLength);
                integer i;
                while (i < listLength)
                {
                    string record = llGetSubString(llList2String(blocks, i), 10, -1);
                    llOwnerSay("- secondlife:///app/agent/" + record + "/about" + " - " + record);
                    ++i;
                }
                blocks = [];
                startDialog(id);
            }
            else if (message == "Add block" || message == "Remove block")
            {
                string label = "add to";
                gManagingBlocks = 1;
                if (message == "Remove block")
                {
                    gManagingBlocks = 2;
                    label = "remove from";
                }
                gDialogHandle = llListen(gDialogChannel, "", id, "");
                llTextBox(id, "\nPlease specify one single avatar UUID you'd like to " + label + " the blacklist storage.", gDialogChannel);
                llSetTimerEvent(60);
            }
            return;
        }

        if (llGetListLength(llLinksetDataFindKeys("blocklist:" + (string)id, 0, 1)) > 0)
        {
            llRegionSayTo(id, 0, "You're blacklisted.");
            return;
        }

        llRegionSayTo(id, 0, "Hello there, secondlife:///app/agent/" + (string)id + "/about - your message: " + message);

    }

    linkset_data(integer action, string name, string value)
    {
        if (action == LINKSETDATA_RESET || action == LINKSETDATA_DELETE || action == LINKSETDATA_UPDATE)
        {
            llOwnerSay("Blacklist storage modified.");
        }
    }

}

注意点

正規表現

ワイルドカード
. 任意の文字に一致
アンカー
^ 文字列の先頭に一致
$ 文字列の末尾に一致
繰り返し
* 直前のアトムに0回以上一致
+ 直前のアトムに1回以上一致
? 直前のアトムに0回または1回一致
{n}

{n,}

{n, m}

直前のアトムにn回、n回以上、またはn回からm回まで一致
サブエクスプレッション
(expression) 丸括弧で囲まれたテキストはマークされたサブエクスプレッションであり、サブエクスプレッションの一部として一致したテキストは抽出されて繰り返すことができます。
選択
a | b aまたはbに一致
文字セット
[abc] 列挙された文字のいずれかに一致
[a-c] 指定された範囲の任意の文字に一致
[^abc] 列挙された文字以外の任意の文字に一致
[[:name:]] 名前付きクラスの任意の文字に一致
上記の文字セット定義は組み合わせることができます
エスケープシーケンス
特定の文字
\e ASCII 0x1B, ESC
\n 改行
\r キャリッジリターン
\t タブ
\xdd コードが dd のASCII文字に一致
単一の文字クラス
\d

\D

任意の10進数の数字に一致
  • \d → [[:digit:]] または [0-9]
  • \D → [^[:digit:]] または [^0-9]
\l

\L

任意の小文字の文字に一致
  • \l → [[:lower:]] または [a-z]
  • \L → [^[:lower:]] または [^a-z]
\s

\S

任意のホワイトスペース文字に一致
  • \s → [[:space:]] または [ \t\r\n]
  • \S → [^[:space:]] または [^ \t\r\n]
\u

\U

任意の大文字の文字に一致
  • \u → [[:upper:]] または [A-Z]
  • \U → [^[:upper:]] または [^A-Z]
\w

\W

任意の"単語"文字に一致

アルファベット、数字、アンダースコア

  • \w → [[:upper:][:lower:][:digit:]_] または [A-Za-z0-9_]
  • \W → [^[:upper:][:lower:][:digit:]_] または [^A-Za-z0-9_]
単語の境界
\< 単語の始まり
\> 単語の終わり
\b
\B 単語の境界でない

*注意* LSLでは文字列内で '\' をエスケープ文字として使用しています。上記のエスケープ文字は二重にエスケープする必要があります。つまり "\d" はLSLでは "\\d" と書く必要があります。

LSL Strings, Escape Codesを参照してください

名前付き文字クラス
alnum 任意の英数字文字
  • [[:alnum:]] → [0-9a-zA-Z]
  • [^[:alnum:]] → [^0-9a-zA-Z]
alpha 任意のアルファベット文字
  • [[:alpha:]] → [a-zA-Z]
  • [^[:alpha:]] → [^a-zA-Z]
blank 行セパレータでない任意のホワイトスペース文字
cntrl 任意の制御文字
  • [[:cntrl:]] → [\x01-\x31]
  • [^[:cntrl:]] → [^\x01-\x31]
digit

d

任意の10進数の数字
  • [[:digit:]] → [0-9]
  • [^[:digit:]] → [^0-9]
lower

l

任意の小文字の文字
  • [[:lower:]] → [a-z]
  • [^[:lower:]] → [^a-z]
print 任意の印刷可能な文字
punct 任意の句読点文字
space

s

任意のホワイトスペース文字
upper

u

任意の大文字の文字
  • [[:upper:]] → [A-Z]
  • [^[:upper:]] → [^A-Z]
word

w

任意の"単語"文字
  • [[:word:]] → [0-9a-zA-Z_]
  • [^[:word:]] → [^0-9a-zA-Z_]
xdigit 任意の16進数の数字文字
  • [[:xdigit:]] → [0-9a-fA-F]
  • [^[:xdigit:]] → [^0-9a-fA-F]

特記事項

Search JIRA for related Issues

Signature

function list llLinksetDataFindKeys( string pattern, integer start, integer count );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。