Mehrdimensionale Liste in Blockingcall_Start und über diese in Finish iterieren?

Begonnen von mumpitzstuff, 26 Mai 2024, 17:31:26

Vorheriges Thema - Nächstes Thema

mumpitzstuff

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?

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mumpitzstuff

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...

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mumpitzstuff

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.