LlLinksetDataFindKeys/ja
Jump to navigation
Jump to search
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: 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 | – | 返されるキーの数。 |
仕様
patternはRegular 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進数の数字に一致 |
|
\l
\L |
任意の小文字の文字に一致 |
|
\s
\S |
任意のホワイトスペース文字に一致 |
|
\u
\U |
任意の大文字の文字に一致 |
|
\w
\W |
任意の"単語"文字に一致
アルファベット、数字、アンダースコア |
|
単語の境界 | ||
\< | 単語の始まり | |
\> | 単語の終わり | |
\b | ||
\B | 単語の境界でない | |
*注意* LSLでは文字列内で '\' をエスケープ文字として使用しています。上記のエスケープ文字は二重にエスケープする必要があります。つまり "\d" はLSLでは "\\d" と書く必要があります。 LSL Strings, Escape Codesを参照してください | ||
名前付き文字クラス | ||
alnum | 任意の英数字文字 |
|
alpha | 任意のアルファベット文字 |
|
blank | 行セパレータでない任意のホワイトスペース文字 | |
cntrl | 任意の制御文字 |
|
digit
d |
任意の10進数の数字 |
|
lower
l |
任意の小文字の文字 |
|
任意の印刷可能な文字 | ||
punct | 任意の句読点文字 | |
space
s |
任意のホワイトスペース文字 | |
upper
u |
任意の大文字の文字 |
|
word
w |
任意の"単語"文字 |
|
xdigit | 任意の16進数の数字文字 |
|
関連項目
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。