[Perl+MYSQL] Arrays 'uitdunnen'

Pagina: 1
Acties:

  • Dragon
  • Registratie: Oktober 2002
  • Laatst online: 23-04 13:53
Deze is misschien heel makkelijk maar ik kom er op het moment echt niet op:

Ik heb een lijst met allemaal gebruikersnamen waar degene met de meeste 'punten' bovenaan de lijst staat.
MySQL:
1
select username from recruit_members ORDER BY gives-gets desc;

dit laden we in array @users

Er mag eens in de 24 uur met een marge geklikt worden op de andere personen. Dat kost de anderen dan weer een punt en levert jou een punt op. Zo krijgen we als het goed is een roterende lijst.
MySQL:
1
select other from recruit_clicklist where time > DATE_SUB(NOW(), INTERVAL 24.1 HOUR);

dit laden we in array @exceptions

Nu wil ik op basis van de twee arrays een nieuwe array maken (@clicklist) waarin alle items zijn weggehaald die in @users staan

Dus als volgt:

@users=test1,test2,test3,test4,test5
@exceptions=test2,test4,test5
--------------------------------------------------
@clicklist=test1,test3

edit:
Ik zit gebonden aan de 3.x versie van mysql

[ Voor 5% gewijzigd door Dragon op 24-04-2004 19:42 ]


  • Dragon
  • Registratie: Oktober 2002
  • Laatst online: 23-04 13:53
Ok ik heb een antwoord gekregen:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
@ArrayA=("test","test2","test3");
@ArrayB=("test","test3");

my @pats = map qr/^\Q$_\E($|\/)/, @ArrayB;
OUTER: for (@ArrayA) {
  for my $pat (@pats) {
    if (/$pat/) {
      push @bad, $_;
      next OUTER;
    }
  }
  push @good, $_;
}


ik wil uiteraard graag horen als er snellere manieren zijn

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Zoiets misschien?
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub subtract
{
    my @A = @{(shift)};
    my @B = @{(shift)};
    my %set;
    foreach $a (@A) { $set{$a}=1; };
    foreach $b (@B) { delete $set{$b}; }
    return keys(%set);
}

# Voorbeeld:
my @A = qw(test1 test2 test3 test4 test5);
my @B = qw(test1 test2 test3);
my @C = subtract(\@A, \@B);
print join(',', @C), "\n";