Avatar billede kernelx Juniormester
13. september 2005 - 16:16 Der er 2 kommentarer og
1 løsning

hash og perl

Hi, jeg har et script:
---
my %test;

$test{'v1'} = "t";
$test{'v2'} = "e";
$test{'v3'} = "s";
$test{'v4'} = "t";

print $test{'v3'}."\n";

---

hvis man starter scriptet giver det:
s

Det er sådan jeg har lært at bruge hashes.
Men nu har jeg en MySQL-Connection med DBI. og min result giver en hash, som jeg ikke forstår hvordan man for fat i en bestemt value.
---
while ($dbValues = $result->fetchrow_hashref)
{
    while (($attr,$value)=each(%$dbValues))
    {
        print $attr.' -> '.$value."\n";
    }
}
---
hvirker - men med "%$" i %$dbValues.
den forstår jeg ikke ...

hvis nu en spalte i DB'en hedder "col1" - hvordan kan jeg så direkte få fat i værdien?
---
while ($dbValues = $result->fetchrow_hashref)
{
    print $dbValues{'col1'}; # virker ikke
}
---


med venlig hilsen
KernelX
Avatar billede nielle Nybegynder
13. september 2005 - 19:35 #1
Det vigtigt at du er klar over at fetchrow_hashref *ikke* giver dig en hash, men derimod en reference til en hash. Det er det man i andre sprog kalder for en pointer.

Med:

while ($dbValues = $result->fetchrow_hashref)

- vil $dbValues altså indeholde pointeren til en hash, og for at få selve hashen, så skal den foranstilles med et %-tegn:

while (($attr,$value)=each(%$dbValues))

Og ligesom du foranstiller med et $-tegn når du vil udskrive et enkelt-element fra en hash, så skal du også bruge et $-tegn i dette tilfælde. Med det $-tegn der allerede er der, bliver det derfor hele 2 $-tegn:

while ($dbValues = $result->fetchrow_hashref)
{
    print $$dbValues{'col1'};  # Virker :^)
}

.oOo.

Man kan selv eftergøre dette i ren perl-kode uden at blande databaser ind:

my %hash;  # Nu har vi en hash.

$hash{"alfa"} = "beta";  # Nu er der nogle værdi-par i hashen.
$hash{"gamma"} = "delta";

print $hash{"alfa"};  # Udskriver "beta".

my $hashRef = \%hash;  # Nu har du en reference til hashen. Det er \-teget som gør dette.

print $$hashRef{"gamma"}  # Udskriver "delta" - læg mærke til de 2 $-tegn.

while (($key, $value) = each($$hashRef))
{
    print $key . ' => ' . $value;  # Udskriver alle par værdi-par.
}
Avatar billede kernelx Juniormester
14. september 2005 - 07:41 #2
mange tak!
husk at skrive det som svar.
Avatar billede nielle Nybegynder
14. september 2005 - 08:47 #3
Jeg smider normalt aldrig et svar før at jeg er helt sikker på at den som spørger har fået ordentligt svar på sit spørgsmål... Det kunne jo tænkes at du havde mere du ville spørge om?

... og et svar :^)
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