Vin
Legacy Member
Probleemsituatie:
Ik beschik over een bestand met namen, en een bestand met adressen.
De bedoeling is om aan elke naam een random adres toe te kennen.
Hiervoor heb ik als volgt een gegevensstructuur opgebouwd:
Vervolgens kies ik at random een postcode, een bijhorende gemeente, en een bijhorende straat. Hierdoor krijg ik een lijst terug met 100 random nummers.
Op deze lijst voer ik een shift operatie uit zodat ik een random element krijg, en zodanig dat dit geen tweede keer opgevraagd kan worden (op die manier kunnen geen 2 mensen op hetzelfde adres wonen).
Ik vrees echter dat ik een beetje vergeten ben hoe referenties ook weer juist werken in Perl, met als gevolg dat er hier iets lijkt mis te lopen. Na enkele controles uitgevoerd te hebben (met de "exists" functie) blijkt dat de hash elementen correct gewist worden. Bij een volgende iteratie (lijn in het personenbestand) durft het script tóch nog een shift uit te voeren op zo'n verwijderde list (met een leeg huisnummer als gevolg...)
Iemand die ziet wat ik niet zie?
Alvast bedankt!
Ik beschik over een bestand met namen, en een bestand met adressen.
De bedoeling is om aan elke naam een random adres toe te kennen.
Hiervoor heb ik als volgt een gegevensstructuur opgebouwd:
Code:
# Datastructuur als volgt opbouwen:
# 0--Postcode1
# | |--Gemeente1
# | | |--Straat1
# | | | |--Nummer1
# | | | *--Nummer2
# | | *--Straat2
# | *--Gemeente2
# *--Postcode2
open STRATEN, "<$STRATEN" or die "Fout bij inlezen van bestand: $STRATEN";
while(<STRATEN>) {
chomp;
# Random array met straatnummers van 1 tot 100 aanmaken
($postcode, $gemeente, $straat) = split /,/;
$adressen{$postcode}{$gemeente}{$straat} = [ List::Util::shuffle( (1..100) ) ];
}
close STRATEN;
Vervolgens kies ik at random een postcode, een bijhorende gemeente, en een bijhorende straat. Hierdoor krijg ik een lijst terug met 100 random nummers.
Op deze lijst voer ik een shift operatie uit zodat ik een random element krijg, en zodanig dat dit geen tweede keer opgevraagd kan worden (op die manier kunnen geen 2 mensen op hetzelfde adres wonen).
Code:
while(<PERSONEN>) {
...
#Random adres uit de gegevensstructuur kiezen
@postcodes = keys %adressen;
$postcode = $postcodes[rand @postcodes];
@gemeentes = keys %{$adressen{$postcode}};
$gemeente = $gemeentes[rand @gemeentes];
@straten = keys %{$adressen{$postcode}{$gemeente}};
$straat = decode_entities $straten[rand @straten];
$nummer = shift @{$adressen{$postcode}{$gemeente}{$straat}};
if ($#{$adressen{$postcode}{$gemeente}{$straat}} == 1) {
delete $adressen{$postcode}{$gemeente}{$straat};
}
if (keys %{$adressen{$postcode}{$gemeente}} == 0) {
delete $adressen{$postcode}{$gemeente};
}
if (keys %{$adressen{$postcode}} == 0) {
delete $adressen{$postcode};
}
...
}
Ik vrees echter dat ik een beetje vergeten ben hoe referenties ook weer juist werken in Perl, met als gevolg dat er hier iets lijkt mis te lopen. Na enkele controles uitgevoerd te hebben (met de "exists" functie) blijkt dat de hash elementen correct gewist worden. Bij een volgende iteratie (lijn in het personenbestand) durft het script tóch nog een shift uit te voeren op zo'n verwijderde list (met een leeg huisnummer als gevolg...)
Iemand die ziet wat ik niet zie?
Alvast bedankt!