Estrarre 2 valori da una stringa: howto e metodi

Aperto da Absynth, Agosto 23, 2010, 08:55:22 PM

Discussione precedente - Discussione successiva

Absynth

Sicuramente ce ne sono altri, ne specifico due che sono abbastanza usati, per sottolinearne uno che (secondo me) è meno usato e più performante.

Esempio classico, estrazione di valori da parametri scritti in notecard

nome=Absynth
password=auth007

lo script deve prendere "Absynth" e "auth007" e memorizzarli in 2 variabili predefinite.

Chiamiamo "data" la stringa (riga di nota) rilevata leggendo la notecard,
e ci siano le variabili globali dichiarate string gNome e string gPass;


Metodo classico: gestione con liste

Si prende la stringa data ("nome=Absynth" oppure "password=auth007"), la si parsa in lista usando "=" come separatore e si prelevano i 2 listindex.

list temp = llParseString2List(data, ["="], []);
string param = llList2String(temp, 0);
string value = llList2String(temp, 1);

if(param == "nome") gNome = value;
else if(param == "password") gPass = value;



Metodo con stringhe

Si cerca la posizione del separatore "=" e poi si prende la parte di stringa che ci serve,
*) dal separatore "in giù" (cancellando da "split" incluso fino in fondo, -1)
*) e dal separatore "in su" (cancellando da "0" a "split");

integer split = llSubStringIndex(data, "="); // rileva la posizione di "="
if(~split)
{
     string param = llDeleteSubString(data, split, -1);
     string value = llDeleteSubString(data, 0,  split);

     if(param == "nome") gNome = value;
     else if(param == "password") gPass = value;
}

la tilde (ALT+126 sul tastierino numerico) significa "complemento di uno", cioè la forma if(~split) equivale a if(split != -1)
In questo caso procediamo solo se l'indice di posizione del separatore da noi cercato non è -1, ossia, è stato effettivamente trovato il separatore nella stringa.

Se siamo nella situazione di dover estrarre coppie di elementi come in questo caso, è più efficace usare il metodo delle stringhe in quanto più veloci da elaborare rispetto alle liste.