You are on page 1of 15

Script intermedio 201

Usare le liste e le stringhe negli


script
Maggio 2009
Pergola

By Salahzar Stenvaag
Script di base (ripasso)
1. // Commento
Commento iniziale
// Questo script fa questo iniziale

integer iDEBUG=1; 2. iDEBUG


Variabili globali
debug(string str){
if(DEBUG==1) llOwnerSay(str); 3. debug
Definizione funzioni
} 4. default
default { Corpo programma
state_entry(){ debug(“Script Reset”); }
touch_start(integer count)
5. Eventi 6. av Variabili locali
state_entr { string av=llKey2Name(llDetectedKey(0));
y debug(“Toccato da “+av);
touch_sta
rt }
}
Variabili (ripasso)


Sono contenitori di valori (numerici,
alfanumerici, vettori)

Le variabili globali si conservano fra le
chiamate agli eventi

Le variabili locali spariscono quando finisce
l'evento
Esempio (ripasso)

// prova di uso globale


integer x=0;
// solita funzione traccia
debug(string str){ llOwnerSay(str); }
// corpo
default {
touch_start(integer numero){
x++;
debug(“Contatore vale: “+(string)numero;
}
}
Stringhe 1 (ripasso)

• “Ciao Avatar” “Si” “No” (elementari)


• “Ciao”+“mondo”
(concatenazione)
• EOF (costanti
speciali)
• “Ciao \n Mondo” (a capo)
• string nome; (dichiarazione
var)
• string nome=”valore”; (inizializzazione)
Stringhe 2 - Operazioni

• “stringa” + S; (concatenazione)
• if(S==”valore”)(verifica se S è proprio “valore”)
• if(S!=”valore”) (se S è diversa da “valore”)
• “\t \n \” \\” (caratteri speciali: tab, acapo,”, \)
• “Novità” (caratteri strani “à” è utf8)
• llStringTrim(S,STRING_TRIM) toglie spazi
prima e dopo
Stringhe 2 – Funzioni base

• llStringLength(S) (ottiene lunghezza di


S)
• llGetSubString(S,inizio,fine) (un pezzo di S)
• trovato=llSubStringIndex(ago,pagliaio)(ricerca)
NOTA
• Le posizioni partono da 0 (1 è il 2o carattere)
• -1 in inizio, fine indicano l'ultimo carattere
• Trovato<0 indica che NON ha trovato
Liste

• [ 1, 2, 3 ] lista con 3 elementi numerici


• [ “alle”, 5, <1,1,1>] lista con 3 elementi misti
• list l; list l1=[ “a”, “b”, “c”]; list l2=[];
dichiarazione di lista. Meglio inizializzare []=lista
vuota senza elementi
• l += [ elemento ]; aggiungere un elemento alla
lista
Es: list x=[]; x += “el1”; x+= “el2”; ==> x vale
[“el1”, “el2”]
Estrazione elementi

• llList2<tipo>(lista,indice) ottiene elemento


normalmente llList2String. Indice vale 0..len-1
Esempio: list l=[“alle”, “falde”, “del”,
“kilimangiaro”;

llList2String(l,0); torna “alle”


llList2String(l,1); torna “falde”
llList2String(l,-1); torna “del” (ultimo!)
• llGetListLength(l) torna quanti elementi nella
lista
Navigazione in una lista

• for(integer i=0;i<=llGetListLength(l);i++){
debug(“Elemento “+(string)i+” vale
“+llList2String(l,i));
}
• for(integer i=0;i<=llGetListLength(l);i++){
string elemento=llList2String(l,i);

if(llSubStringIndex(“salahzar”,llToLower(elemen
to))>=0) {
debug(“L'elemento “+(string)i+” contiene
salahzar”);
Ricerca veloce

• llListFindList(lista,[ “salahzar” ]); torna >=0 se


ha trovato un elemento == “salahzar”
• llList2List(lista, inizio,fine); estrae una sottolista
llList2List([ 1,2,3,4],1,-1); torna [2,3,4]
Se le cose da memorizzare sono + di 1, esempio
avatar, data di touch si usano 2 liste
• List l; list date; l+=[ avatar];
date+=[ llGetTimeStamp() ]; (llGetUnixTime());
"YYYY-MM-DDThh:mm:ss.ff..fZ" n. secondi
Tocca e fa solo la prima volta
oppure dopo un giorno
List avs=[]; list t=[]; // quando ha toccato
touch_start(integer n){key av=llDetectedKey(0);
integer f=llListFindList(avs,[av]);
if(f>=0){
integer s=llList2Integer(times,f);
if( (s – llGetUnixTime()) > 24*60*60){
avs=llDeleteSubList(avs,f,f); // toglie!
t=llDeleteSubList(t,f,f); // toglie!
f=-1; }
if(f<0){ // non c'era o è + di 1 giorno!
// fai l'azione => lascia sedere ad es.
avs+= [av]; t+= [ llGetUnixTime() ]; }
Liste immutabili

Non potete cambiare un elemento dentro una


lista... Per farlo dovete creare una nuova lista :(

lista=llDeleteSubList(lista,inizio,fine); cancella

lista=llListReplaceList(lista,[ el ], f, f); sostituisce
l'elemento f con el!!!

llListReplaceList aggiorna oppure aggiunge
elementi in mezzo.
Liste Intervallate


E' una alternativa ad usare 2 liste (o n)

Si usa una sola lista con “coppie” di valori: list
avstimes=[ av1, t1, av2, t2, av3, t3 ];

Usate da llListSort(avs,2,TRUE);

f=llListFindList(avstimes,[av]); cerca l'avatar

llList2Integer(avstimes,f+1); torna il tempo per
quell'avatar

llList2ListStrided(avstimes,f,f,2); av posto f
llList2ListStrided(llDeleteSubList(avstimes,0,0),f
,f,2); tempo dell'avatar posto f
Liste <=> Stringhe


LlList2CSV([ “a”,”b”,5]) => “a,b,5”

llCSV2List(“a,b,5”) => [“a”,”b”,”5”]; attenzione

llParseString2List(“a-b-5”,[“-“],[]) => [“a”,”b”,”5”];

llParseStringKeepNulls(“a==5”,[“=”],[]);
=> [“a”,””,”5”]
invece
llParseString2List(“a==5”,[“=”],[]);
=> [“a”,”5”]
Attenzione alla differenza

You might also like