22. oktober 2007 - 21:19Der 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"?
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.
Synes godt om
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:
(undskyld forglemmelsen, jeg giver selvfølgelig point til alle)
Synes godt om
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
Synes godt om
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.
Synes godt om
Slettet bruger
23. oktober 2007 - 15:43#7
Dem som vil have point må gerne skrive et svar.
Synes godt om
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)
Synes godt om
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.
Synes godt om
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.
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});
Synes godt om
Slettet bruger
24. oktober 2007 - 00:21#15
print scalar keys %{ $list{12}{names} }
Synes godt om
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.
Synes godt om
Slettet bruger
24. oktober 2007 - 01:28#17
Mange tak! :)
Synes godt om
Ny brugerNybegynder
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.