Seite 1 von 1

HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 17.04.2019, 10:19
von dtp
Hallo,

ich möchte eine Art FIFO-Puffer programmieren. Sprich, es wird eine Liste aus einer Systemvariablen ausgelesen, dann soll ein neuer Eintrag an den Anfang der Liste geschrieben und der älteste Eintrag vom Ende der Liste entfernt werden. Die Liste soll beliebige Trennzeichen enthalten können. Bevorzugt wird "\n" zur schöneren Darstellung der Listeneinträge. Schließlich soll die Liste wieder in die Systemvariable geschrieben werden. Zusätzlich soll auch noch bestimmt werden können, wie viele alte Listeneinträge vom Ende der Liste entfernt werden.

Das Lesen aus und das Schreiben in die Systemvariable ist kein Thema. Auch nicht das Schreiben neuer Einträge in die Liste. Mir geht es eher um das Entfernen der Listeneinträge. Hab mir auch schon Gedanken dazu gemacht und ein simples Testskript geschrieben.

Code: Alles auswählen

string list = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk\nl\nm\nn\no\np";
integer numberOfElements = 6;
integer cnt = 0;
string listNew = ""; string listElement;

foreach(listElement, list.Split("\n")){
  if(cnt < numberOfElements){listNew = listNew#listElement#"\n";}
  cnt = cnt + 1; 
}

WriteLine(listNew);

!Ausgabe: a\nb\nc\nd\ne\nf\n
Funktioniert auch, wie gewollt. Aber muss man wirklich über eine foreach-Schleife gehen, oder fällt euch ggf. noch eine simplere und schnellere Lösung ein? Ein direkter Skriptbefehl zum Entfernen der n letzten oder ersten Listeneinträge ist mir ehrlich gesagt nicht bekannt. Oder könnte das mit .StrValueByIndex bzw. .Substr funktionieren?

Gruß,

Thorsten

Re: HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 17.04.2019, 11:04
von Bratmaxe
So jetzt habe ich's :wink:

Code: Alles auswählen

! fifo
string list = "g\nf\ne\nd\nc\nb\na";
WriteLine("Liste beim Start: \n" # list # "\n");
integer numberOfElements = 6;
string Trennzeichen = "\n";
string newElement = "h";
WriteLine("Neues Element: \n" # newElement # "\n");
string newList = ""; 

string lastElement = list.StrValueByIndex(Trennzeichen, numberOfElements);

newList = newElement # Trennzeichen # list.Substr(0,(list.Length() -1 - lastElement.Length() -1 - Trennzeichen.Length() - 1));

WriteLine("Liste am Ende: \n" # newList # "\n");

Re: HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 17.04.2019, 11:47
von dtp
Hallo Carsten,

danke für deine Lösung. Hat Charme, aber auch den kleinen Nachteil, dass ich wirklich auf die reine FIFO-Funktionalität angewiesen bin und nicht mehrere alte Listeneinträge entfernen kann. Aber das könnte man ja ggf. ergänzen.

Gruß,

Thorsten

Re: HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 17.04.2019, 13:06
von Bratmaxe
Wenn du das ganze über eine Systemvariable vom Typ WerteListe machst, gibt es noch eine andere Möglichkeit:

Code: Alles auswählen

object svObj = dom.GetObject(ID_SYSTEM_VARIABLES).GetObject("TEST");
if (svObj)
{   
    WriteLine(web.webGetValueFromList(svObj.ValueList(), 1));
}
Allerdings habe ich "web" noch nirgends gefunden, vielleicht gibt es auch eine Funktion zum Hinzufügen / Löschen eines Eintrages.

Re: HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 17.04.2019, 16:48
von dtp
Was macht denn der web-Befehl genau?

Eine Systemvariable vom Typ Werteliste nützt mir leider nichts, da die einzelnen Listeneinträge variabel sind.

Re: HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 17.04.2019, 19:32
von alchy
in dem Fall Namensraum web und die Regascriptmethode webGetValueFromList()

Wird z.B. angewendet, um den im Moment aktiven Wert einer Wertelistenvariablen auszulesen ohne .StrValueByIndex() zu benutzen.
Eine Wertelistenvariable könnte das was du willst wahrscheinlich auch abbilden.
Aber da du den Wert nur als "Speicher" benutzen willst, ohne einen der Werte als "aktiv" zu setzen ist das *IMHO* eher nicht zielführend.


Alchy

Re: HM-Skript, Frage zur Beschränkung einer Liste

Verfasst: 18.04.2019, 09:42
von dtp
Danke für die Info.