Suchen in Verschachtelten Array, referenz zurück geben
MrSpoocy
- perl
1 CPAN
Hi,
also ich hab da irgendwie ein Problem. Ich versuche erst mal zu beschrieben was genau das Ergebnis sein soll.
Eine Funktion bekommt 2 werte übergeben.
Der 1te wert ist der "alte" zustand und der zweite der neue.
Nun soll die Funktion abgleichen ob das aufwerten von "alt" auf "neu" möglich ist.
Dazu gibt es einen Vergleichs Array der verschachtelt ist.
Nun sollte es so ablaufen das in diesem Array nach "alt" gesucht wird, und dann NUR noch mit den werten verglichen wird welche im gleichen Array oder tiefer zu finden sind. Also wenn er eine "ebene" betreten hat und dort alt gefunden hat darf er diese nicht mehr verlassen. Hat man "alt" nicht gefunden kann er die ebene ohne weiteres wieder verlassen.
Mein Ansatz ist irgendwie mit grep den Array durchsuchen und dann nur die liste der möglichen "neuen" werte zu haben. Und danach diese noch mal durchsuchen.
my $alt = 13;
my $neu = 4008;
my @jobArray = (
0,[4023],[23,[4045]],[
[24],
[25],
[4046,[4047,4048],[4049]],
[1,[4024],[7,13,[4030,4036],4002,4008,4014],[14,21,[4037,4044],4002,4015,4022]],
[2,[4025],[9,[4032],4003,4010],[16,[4039],4003,4017]],
[3,[4026],[11,[4034],4004,4012],[19,[4042],4004,4020],[20,[4043],4004,4021]],
[4,[4027],[8,[4031],4005,4009],[15,[4038],4005,4016]],
[5,[4028],[10,[4033],4006,4011],[18,[4041],4006,4019]],
[6,[4029],[12,[4035],4007,4013],[17,[4040],4007,4018]]
]);
In dem oberen Beispiel müsste TRUE raus kommen.
Wenn z.b. $alt = 4028; und $neu = 10; ist, müsste FALSE kommen da 4028 keine weiteren Elemente oder tiefere Array mehr hat.
würde mich über Denkansätze oder Lösungen freuen,
mfg MrSpoocy
Ich hab mir das jetzt zwanzigmal durchgelesen und weiß immer noch nicht genau, was du bezwecken willst. Der Algorithmus ist dermaßen schwammig beschrieben, dass man nur rätseln kann. Insbesonders der Teil mit der Ersetzung durch $neu ist vollkommen undurchsichtig.
use autobox::Core;
use Data::Leaf::Walker qw();
my $walker = Data::Leaf::Walker->new(\@jobArray);
while (my ($path, $value) = $walker->each) {
if ($value == $alt) {
$path->pop;
sprintf("$alt hat %d Nachbarn/Kinder.",
[$walker->fetch($path)->grep(sub {$_[0] != $alt})]->length)->say;
}
}
P.S.: Deine Datenstruktur ist dämlich. Hätte es nicht ein Hash sein können? Dann hätte ein Einzeiler mit dpath genügt.