/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
uninitialized value in concatenation
Fra : Michael


Dato : 01-05-04 13:45

Use of uninitialized value in concatenation (.) or string at ./script.pl
line 73.

Jeg får ovensteånde fejl ud på terminalen i forbindelse med med hashes

jeg har f.eks.

$Tmp{ $ID }{ 'foo' } = $foo;

Hvis jeg så senere forsøger at indsætte noget i min database hvor indholdet
af $Tmp{ $ID }{ 'foo' } ikke er sat, så kommer fejlen.

Spørgsmålet er nu hvordan jeg trapper denne fejl, så jeg kan f.eks. logge
den?

Jeg forsøger iøvrigt at slette med

delete $Tmp{$ID};

Men at dømme ud fra processens ram forbrug, ser det ikke ud til at den
slettes helt. Hvad gør jeg galt?

--
Mvh



 
 
Morten Guldager (01-05-2004)
Kommentar
Fra : Morten Guldager


Dato : 01-05-04 14:52

Sat, 01 May 2004 at 12:44 GMT Michael wrote
> Use of uninitialized value in concatenation (.) or string at ./script.pl
> line 73.
>
> Jeg får ovensteånde fejl ud på terminalen i forbindelse med med hashes
>
> jeg har f.eks.
>
> $Tmp{ $ID }{ 'foo' } = $foo;
>
> Hvis jeg så senere forsøger at indsætte noget i min database hvor indholdet
> af $Tmp{ $ID }{ 'foo' } ikke er sat, så kommer fejlen.

Jammen, så er der jo nok ikke dat noget ind i din hash.

Har du prøvet at udskrive $ID og $foo umiddelbart før du
lægger data i hash'en?

> Spørgsmålet er nu hvordan jeg trapper denne fejl, så jeg kan f.eks. logge
> den?

Noget i stil med følgende kunne måske bruges:

unless (defined $Tmp{ $ID }{ 'foo' })
{
warn "Stor krise, nogen har glem at hælde bits i tanken.\n";
}
else
{
printf "2 gange foo er: %d", $Tmp{ $ID }{ 'foo' } * 2;
}

> Jeg forsøger iøvrigt at slette med
>
> delete $Tmp{$ID};
>
> Men at dømme ud fra processens ram forbrug, ser det ikke ud til at den
> slettes helt. Hvad gør jeg galt?

Tja, hvis du prøver at slette noget der slet ikke findes skal du
nok ikke regne med et mindre ram forbrug.


/Morten

Peter Makholm (03-05-2004)
Kommentar
Fra : Peter Makholm


Dato : 03-05-04 08:37

"Michael" <ugyldig@email.dk> writes:

> Jeg forsøger iøvrigt at slette med
>
> delete $Tmp{$ID};
>
> Men at dømme ud fra processens ram forbrug, ser det ikke ud til at den
> slettes helt. Hvad gør jeg galt?

Du tror at du programmerer i C?

$Tmp{$ID} er en reference til en større datastruktur. Når du kalder
delete bliver denne reference fjernet og datastrukturens
referencecount flader med en. Hvis datastrukturens referencecounter
når 0 kan datastrukturen slettes, men den bliver ikke nødvendigvis
slettet med det samme.

Så enten har du andre referencer til datastrukturen eller også vil din
datastruktur blive fjernet næste gang der kommer en garbage-collector
forbi.

(Jeg ved ikke noget konkret om perls garbagecollector ud over at jeg
er ret sikker på at den er baseret på referencecounting)

--
Peter Makholm | The four letter word beginning with L?
peter@makholm.net | It's life, love, libc or lisp
http://hacking.dk | -- Depending on you point of view

Lars Balker Rasmusse~ (03-05-2004)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 03-05-04 08:42

Peter Makholm <peter@makholm.net> writes:
> (Jeg ved ikke noget konkret om perls garbagecollector ud over at jeg
> er ret sikker på at den er baseret på referencecounting)

Det er den, hvorfor man selv er ansvarlig for at rydde op (dvs. bryde
cyklerne), hvis man har cykliske datastrukturer.
--
Lars Balker Rasmussen Consult::Perl
http://consult-perl.dk

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste