FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: mumpitzstuff am 26 Mai 2024, 17:31:26

Titel: Mehrdimensionale Liste in Blockingcall_Start und über diese in Finish iterieren?
Beitrag von: mumpitzstuff am 26 Mai 2024, 17:31:26
Ich komme leider nicht so richtig weiter bei einem Problem mit mehrdimensionalen Listen in Perl. Kann mir bitte jemand auf die Spünge helfen?
Es gibt bereits ein Modul, das ich erweitern möchte. Aktuell wird in dem Modul im Blockingcall_Start eine Liste erzeugt, die im Finish entgegen genommen und verarbeitet wird. Ich möchte nun den Code innerhalb von Blockingcall_Start 2 x durchlaufen, wodurch das return nun 2 Listen zurückgeben müsste. Über diese zwei Listen müsste ich dann im Finish drüber laufen.

Original:

sub Blockingcall_Start {
  ...
  my $result = [ 'nameA', 'dataA1', 'dataA2 ];
  ...
 
  return $result;
}

sub Blockingcall_Finish {
  my ($nameA, $dataA1, $dataA2) = @_;

  # mach was damit
}



Modifiziert:

sub Blockingcall_Start {
  ...
  my $result = [ 'nameA', 'dataA1', 'dataA2 ];
 
  # Wie kann ich hier eine zweite Liste dran hängen mit dem Inhalt [ 'nameB', 'dataB1', 'dataB2 ]?
  $result = ???
  ...
 
  return $result;
}

sub Blockingcall_Finish {
  # Wie kann ich hier in einer Schleife die beiden Listen separat extrahieren?
 
  foreach ??? {
    my ($name, $data1, $data2) = ???;

    # mach was damit
  }
}

Ich kriege es irgendwie nicht hin, im return von Blockingcall_Start die beiden Listen zurückzugeben und in Blockingcall_Finish eine Schleife über die beiden Listen zu erzeugen. Hat hier jemand vielleicht eine Idee?
Titel: Aw: Mehrdimensionale Liste in Blockingcall_Start und über diese in Finish iterieren?
Beitrag von: betateilchen am 27 Mai 2024, 11:20:14
abgesehen davon, dass bei dataA2 und dataB2 ein hochkomma fehlt...

Man kann an ein array problemlos eine zweite Dimension anhängen

my @result = ( [ 'nameA', 'dataA1', 'dataA2' ],
               [ 'nameB', 'dataB1', 'dataB2' ] );

Das Anhängen an @result sollte einfach mit push() möglich sein.
Titel: Aw: Mehrdimensionale Liste in Blockingcall_Start und über diese in Finish iterieren?
Beitrag von: mumpitzstuff am 27 Mai 2024, 11:34:46
Ich bin mir nicht sicher, ob ich dann @result bei einem BlockingCall mit Return zurück geben darf bzw an Finish übergeben darf. Ich dachte immer, dass das ein Scalar sein muss. Zudem hatte ich bei meinen Versuchen danach übelste Probleme das im BlockingCall finish wieder irgendwie benutzbar zu machen, weil die zusätzlichen Dimensionen dann irgendwie Referenzen waren und ich da nicht einfach so drüber loopen konnte. Das kam wahrscheinlich dadurch zustande das ich das mehrdimensionale Array in ein Scalar rein gepackt habe...

PS: Fehlende Hochkommata bitte ich zu entschuldigen, das war nur platt runtergeschrieben in dem Beitrag, da der Originalcode zu kompliziert gewesen wäre...
Titel: Aw: Mehrdimensionale Liste in Blockingcall_Start und über diese in Finish iterieren?
Beitrag von: betateilchen am 27 Mai 2024, 12:12:08
Wenn man genauer wüsste, was Du eigentlich tun möchtest, könnte man Dir vermutlich besser helfen.

Kannst Du die Werte nicht in einem hash übergeben?
Das ließe sich vermutlich einfacher serialisieren.
Titel: Aw: Mehrdimensionale Liste in Blockingcall_Start und über diese in Finish iterieren?
Beitrag von: mumpitzstuff am 27 Mai 2024, 13:17:19
Ich habe erst mal die zu übergebenden Werte in ein String gepackt und ein Trennzeichen verwendet, anstatt ein Array zu verwenden. Das kann ich mir im Finish dann wieder zerlegen. Aber serialisieren ist ein gutes Stichwort, daran hab ich irgendwie gar nicht mehr gedacht. Ich danke dir.