Slobodan: Intersection of "viel" arrays :-)

Beitrag lesen

hi,

Die Funktion erwartet Arrays, also gib ihr Arrays ;) Zur Zeit musst du jedes Array, das im Hash ist, einzeln angeben. Aber du findest dafür sicher eine einfache Lösung. Mir fällt so spät nichts mehr ein ;)

nach dem man ein wenig geschlaffen hat, kommen einem
Ideen und richtige Ansätze "fast" von aleine :)

Wie gesagt ich hatte Hash zu verfügung und müsste das
irgendwie an die Funktion übergeben.

Hier der (vielleicht nicht ganz so gute) Abschluss:

--------------- code ---------------
#!perl.exe -w

#print "Content-type: text/html\n\n";

nehmen wir an - wir haben vier Arrays

@a = ("eins", "zwei", "drei", "vier", "fuenf", "acht");
@b = ("zwei", "drei", "fuenf", "acht");
@c = ("eins", "drei", "fuenf", "acht");
@d = ("drei", "acht");
#@d = ("two", "five"); # für nicht erfolgreiche Suche
#######################

wir wollen nicht die Arrays an die Funktion

übergeben, sondern Hash der die Arrays enhält

für den Beispiel lese ich die Arrays erstmal in ein Hash

$anzahl_der_arrays = 4;
for($akt_lista = 1; $akt_lista <= $anzahl_der_arrays; $akt_lista++) {
if($akt_lista == 1) { push @{ $hash{$akt_lista} }, @a; }
if($akt_lista == 2) { push @{ $hash{$akt_lista} }, @b; }
if($akt_lista == 3) { push @{ $hash{$akt_lista} }, @c; }
if($akt_lista == 4) { push @{ $hash{$akt_lista} }, @d; }
}

und jetzt füllen wir den Array @aufruf (Funktionsaufruf) mit Daten

foreach $schluessell (keys %hash) {
push @aufruf, @{ $hash{$schluessell} };
}
@results = &intersect(@aufruf);

if(@results) {
print "<br>Intersection:<b> @results</b>\n";
} else {
print "<br>Leider gab es keine gemeinsamkeiten.\n";
}

sub intersect {

hier vielleicht

local $i;

for (@{scalar shift}) {
    $union[0]{$_} = 1;
  }
  while (@_) {
    $i++;
    for (@{scalar shift}) {
      if ($union[$i-1]{$_}) { $union[$i]{$_} = 1; }
    }
  }
  return keys %{$union[$i]};
}
--------------- code end ------------

biss dann

Slobo