Avatar billede Slettet bruger
22. oktober 2007 - 21:19 Der er 16 kommentarer og
1 løsning

Array indeks

Jeg har brug for at holde styr på en række ID numre (1-1000000). Scriptet indlæser f.eks. 1000 numre, og efterfølgende skal jeg kunne tjekke, om x er indlæst. Hvordan gøres det smartest?

Jeg har prøvet at bruge følgende:

$ids[24466] = true;
$ids[176752] = true;

I så fald vil jeg kunne bruge "if ($ids[x]) {". Men perl sætter @ids arrayens længde til det højeste ID nummer ($#ids = 176752) ligesom $ids[0], $ids[1] osv. sættes til 0. Det ødelægger muligheden for at bruge each().

Hvordan kan jeg ellers holde styr på en lang række tilfældige tal,  med mulighed for "opslag"?
Avatar billede nielle Nybegynder
22. oktober 2007 - 21:25 #1
Hvorfor ikke bruge en hash i stedet for et array?
Avatar billede mfalck Praktikant
22. oktober 2007 - 21:32 #2
%seen = ();
foreach $item (@list) {
    push(@uniq, $item) unless $seen{$item}++;
}

fra http://pleac.sourceforge.net/pleac_perl/arrays.html
Avatar billede Slettet bruger
22. oktober 2007 - 21:33 #3
Det anvender man traditionelt en hash til (jeg gaetter paa at du kommer fra PHP?)

$ids{24466} = 1

og saa kan man lave

if ( exists $ids{24466} )

bemark at

if ( exists $ids{24466} )

og

if ( $ids{24466} )

kan give forskellige resultater alt efter vaerdien af $ids{24466}, hvis vaerdien f.eks. er 0, saa er den sidste falsk, mens den foerste er sand, fordi $ids{24466} eksisterer.
Avatar billede Slettet bruger
23. oktober 2007 - 14:25 #4
Hov, jeg glemte at nævne en vigtig detalje :$ hvert ID nummer har informationer vedhæftet. Jeg har tidligere brugt:

$ids[24466][0] = true;
$ids[24466][1] = "stringx";
osv.

Det kan man ikke med hash. $ids{24466}[0] = true giver fejl. Er løsningen blot at bruge flere hash arrayes?

$ids{24466} = true;
$idstrings{24466} = "stringx";

(undskyld forglemmelsen, jeg giver selvfølgelig point til alle)
Avatar billede Slettet bruger
23. oktober 2007 - 14:43 #5
lav en hash af hash, saa er det ogsaa nemmere at huske hvad de enkelte ting er

f.eks.

$ids{24466} = { shown => 1, comment => 'tekst' };

saa er

$ids{24466}->{shown} lig 1

-> kan vaere rar at anvende for at goere tingene mere laesbart.


Nu kom jeg lige til at se paa dit foerste indlaeg, hvor meget data har du taenkt dig at laese ind i hukommelsen? Det kunne maaske vaere en ide at anvende en database
Avatar billede Slettet bruger
23. oktober 2007 - 15:43 #6
OK, sådan vidste jeg ikke man kunne bruge hashes. Tak for det.

Scriptet bliver kontaktes 10-100 gange i sekundet, og vil "kun" skulle holde styr på op til 10.000 ids ad gangen. Derfor ønsker jeg ikke at der skal oprettes databaseforbindelse hver gang.
Avatar billede Slettet bruger
23. oktober 2007 - 15:43 #7
Dem som vil have point må gerne skrive et svar.
Avatar billede Slettet bruger
23. oktober 2007 - 15:50 #8
du kommer godt nok til at bruge meget hukommelse ved det der, isaer hvis det skal koere saa mange gange i sekundet. Det kunne vaere en god ide at bruge en database samt mod_perl (jeg formoder at dette er til en webapplikation).

Man kan finde bogen Practical Mod_Perl gratis online (under en CC licens)
Avatar billede Slettet bruger
23. oktober 2007 - 16:13 #9
Mener du at det er hurtigere at gemme og hente data i en database fremfor fra en variabel? Med 10.000 IDer kommer jeg jo nok kun op på 100-500 kb som skal ligge i hukommelsen.
Avatar billede Slettet bruger
23. oktober 2007 - 16:15 #10
Det skal siges at scriptet kører kun i én "udgave". Det lytter på en socket og behandler forespørgsler løbende. Det skal ikke initialiseres ved hver forespørgsel.
Avatar billede Slettet bruger
23. oktober 2007 - 17:17 #11
saa gaar deet nok
Avatar billede nielle Nybegynder
23. oktober 2007 - 18:25 #12
Jeg står over på denne her. :^)
Avatar billede mfalck Praktikant
23. oktober 2007 - 21:01 #13
ja - mit svar var heller ikke noget værd i den sammenhæng :-)
Avatar billede Slettet bruger
24. oktober 2007 - 00:01 #14
Lige et tillægsspørgsmål:

$list{12} = {
    "names"=>{
        1=>"martin",
        2=>"peter",
        }
    };

Hvordan finder jeg ud af, at $list{12}{names} indeholder 2 elementer/key-value par? Følgende virker ikke:

print scalar keys(%list{12}{names});
Avatar billede Slettet bruger
24. oktober 2007 - 00:21 #15
print scalar keys %{ $list{12}{names} }
Avatar billede Slettet bruger
24. oktober 2007 - 00:23 #16
hov kom til at trykke paa et eller andet

%list{12}{names} dur ikke da den ikke ved hvilken hash du henviser til, dette staar beskrevet i Programming Perl.

keys behoever ikke parenteser omkring argumentet.
Avatar billede Slettet bruger
24. oktober 2007 - 01:28 #17
Mange tak! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester