Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Was bedeutet diese Fehlermeldung?

2 views
Skip to first unread message

Oliver 'ojo' Bedford

unread,
Nov 19, 2009, 1:08:46 PM11/19/09
to
Bei der Ausführung eines Skriptes bekomme ich folgende Fehlermeldung:

Attempt to free unreferenced scalar: SV 0x7faf3f8f84a0, Perl interpreter: 0x11b7010 at ./tkscan2pdf.pl line 843.
Attempt to free unreferenced scalar: SV 0x320d168, Perl interpreter: 0x11b7010 at ./tkscan2pdf.pl line 843.

Code-Schnipsel (Teil eines Tk Callbacks):

open(TOUT, ">:encoding($charset)", "text.txt")
or die ("Could not open text file for writing!");
# loop over all input files
foreach ( sort( keys( %output_records ) ) ) {
$fi = $_;
foreach ( sort(keys( %{$output_records{$fi}[1]} ) ) ) {
print TOUT "\n\n";
}
}
close(TOUT); <-- Zeile 843

Was will er hier von mir?

Ratlos,
Oliver

Peter J. Holzer

unread,
Nov 21, 2009, 4:03:24 AM11/21/09
to
On 2009-11-19 18:08, Oliver 'ojo' Bedford <new...@web.de> wrote:
> Bei der Ausf�hrung eines Skriptes bekomme ich folgende Fehlermeldung:

Er will Dir sagen, dass Du einen schwerwiegenden Bug im Memory-Handling
gefunden hast. Dieser Bug kann in Perl selbst sein, oder (wesentlich
wahrscheinlicher) in einem Modul, das Du verwendest.

Der Code-Schnipsel, den Du gepostet hast, enth�lt nichts, was verd�chtig
aussieht. Ich rate aber mal, dass unmittelbar danach der Block zu Ende
ist, und sie die Fehlermeldung auf das Ende des Blocks, nicht auf das
close() bezieht. Ich rate weiterhin, dass Du in diesem Block ein oder
mehr lexikalische Variablen definiert hast, die Objekte von Tk oder
einem verwandten Modul sind. Der Fehler liegt dann in diesem Modul.

hp

Oliver 'ojo' Bedford

unread,
Nov 21, 2009, 6:35:56 AM11/21/09
to
Am Sat, 21 Nov 2009 10:03:24 +0100 schrieb Peter J. Holzer:


> Er will Dir sagen, dass Du einen schwerwiegenden Bug im Memory-Handling
> gefunden hast. Dieser Bug kann in Perl selbst sein, oder (wesentlich
> wahrscheinlicher) in einem Modul, das Du verwendest.

Hmm. OK, das übersteigt dann meinen Horizont.

> Der Code-Schnipsel, den Du gepostet hast, enthält nichts, was verdächtig


> aussieht. Ich rate aber mal, dass unmittelbar danach der Block zu Ende
> ist, und sie die Fehlermeldung auf das Ende des Blocks, nicht auf das
> close() bezieht. Ich rate weiterhin, dass Du in diesem Block ein oder

Das ist richtig. Wenn ich vor das close() ein print; setze, erscheint
die Fehlermeldung, wenn ich beides weglasse meldet er mir den Fehler
in Tk.pm (IIRC).

> mehr lexikalische Variablen definiert hast, die Objekte von Tk oder
> einem verwandten Modul sind. Der Fehler liegt dann in diesem Modul.

Das Problem liegt an den foreach Schleifen oder zumindest wird
die Fehlermeldung durch sie hervorgerufen. Wenn ich
foreach $fi (...) an Stelle von foreach (...) { $fi = $_; ... }
verwende, gibt es keinen Fehler. Erste Variante ist sicher schöner,
ich hatte nur gedacht, dass es eigentlich keinen Unterschied macht. (*)

Ich werde mal versuchen, das Problem weiter einzugrenzen.

Ciao,
Oliver

(*) Dazu sollte ich vielleicht noch anmerken, dass das was ich treibe
eigentlich nichts mit planvoller Software-Erstellung zu tun hat.

Peter Velan

unread,
Nov 21, 2009, 10:26:07 AM11/21/09
to
Hallo,

habe hier 'n Skript, in dem (fast) alle Zuweisungen á la "||="
geschrieben sind - Beispiel:

$var1 ||= 'test1';

Wo kann ich mich über das Besondere dieser Schreibweise informieren?
(Google, Yahoo, etc. wollen nicht so recht nach "||=" suchen)

Gruß,
Peter

Peter Velan

unread,
Nov 21, 2009, 10:27:50 AM11/21/09
to
Hallo,

habe hier 'n Skript, in dem (fast) alle Zuweisungen ᅵ la "||="
geschrieben sind - Beispiel:

$var1 ||= 'test1';

Wo kann ich mich ᅵber das Besondere dieser Schreibweise informieren?


(Google, Yahoo, etc. wollen nicht so recht nach "||=" suchen)

Gruᅵ,
Peter

Peter J. Holzer

unread,
Nov 21, 2009, 12:27:21 PM11/21/09
to
On 2009-11-21 11:35, Oliver 'ojo' Bedford <new...@web.de> wrote:
> Am Sat, 21 Nov 2009 10:03:24 +0100 schrieb Peter J. Holzer:
>> Der Code-Schnipsel, den Du gepostet hast, enth�lt nichts, was verd�chtig
>> aussieht. Ich rate aber mal, dass unmittelbar danach der Block zu Ende
>> ist, und sie die Fehlermeldung auf das Ende des Blocks, nicht auf das
>> close() bezieht. Ich rate weiterhin, dass Du in diesem Block ein oder
>
> Das ist richtig. Wenn ich vor das close() ein print; setze, erscheint
> die Fehlermeldung, wenn ich beides weglasse meldet er mir den Fehler
> in Tk.pm (IIRC).

Slaven ist (oder war? Schon l�ngere Zeit nichts mehr von ihm gelesen)
ein Regular dieser Gruppe. Vielleicht f�llt ihm dazu was ein.


>> mehr lexikalische Variablen definiert hast, die Objekte von Tk oder
>> einem verwandten Modul sind. Der Fehler liegt dann in diesem Modul.
>
> Das Problem liegt an den foreach Schleifen oder zumindest wird
> die Fehlermeldung durch sie hervorgerufen. Wenn ich
> foreach $fi (...) an Stelle von foreach (...) { $fi = $_; ... }
> verwende, gibt es keinen Fehler.

Verbl�ffend. Man m�sste annehmen, dass der Fehler also etwas mit dem
Wert in $_ zu tun hat, aber das ist hier ein Hash-Key, also ein
einfacher String. Das kann es ja wohl nicht sein.


> Ich werde mal versuchen, das Problem weiter einzugrenzen.

Versuche, ein minimales Programm zu erstellen, bei dem der Fehler
auftritt.

Ich bin gespannt.

hp

Peter J. Holzer

unread,
Nov 21, 2009, 12:29:12 PM11/21/09
to
On 2009-11-21 15:27, Peter Velan <news-...@7fun.de> wrote:
> habe hier 'n Skript, in dem (fast) alle Zuweisungen � la "||="

> geschrieben sind - Beispiel:
>
> $var1 ||= 'test1';
>
> Wo kann ich mich �ber das Besondere dieser Schreibweise informieren?

> (Google, Yahoo, etc. wollen nicht so recht nach "||=" suchen)


http://perldoc.perl.org/perlop.html#Assignment-Operators

hp

Uwe Kausch

unread,
Nov 21, 2009, 1:28:56 PM11/21/09
to


Hallo Peter,

mit "||=" wird zunᅵchst geprᅵft ob die Variable logisch FALSCH (false) ist, wenn das der Fall ist wird der Variable ein neuer Wert zugewiesen. So entspricht ...
$MyTown ||= "Munich";
... folgernder IF-Anweisung ...
if (!($MyTown || $MyTown)) {$MyTown = "Munich"};

Hier ein paar Beispiele:
$MyTown = 56;
$MyTown ||= "Munich";
print $MyTown => Ausgabe: 56

$MyTown = 0;
$MyTown ||= "Munich";
print $MyTown => Ausgabe: Munich

$MyTown = $null;
$MyTown ||= "Munich";
print $MyTown => Ausgabe: Munich

$MyTown = "Berlin";
$MyTown ||= "Munich";
print $MyTown => Ausgabe: Berlin

$MyTown ||= "Munich";
print $MyTown => Ausgabe: Munich

$MyTown = "Berlin";
undef($MyTown);
$MyTown ||= "Munich";
print $MyTown; => Ausgabe: Munich

Grᅵᅵe,
Uwe

Peter Velan

unread,
Nov 22, 2009, 4:09:44 AM11/22/09
to
am 21.11.2009 19:28 schrieb Uwe Kausch:

> Peter Velan wrote:
>> habe hier 'n Skript, in dem (fast) alle Zuweisungen ᅵ la "||="
>> geschrieben sind - Beispiel:
>>
>> $var1 ||= 'test1';
>
> mit "||=" wird zunᅵchst geprᅵft ob die Variable logisch FALSCH
> (false) ist, wenn das der Fall ist wird der Variable ein neuer Wert
> zugewiesen. So entspricht ...
> $MyTown ||= "Munich";
> ... folgernder IF-Anweisung ...
> if (!($MyTown || $MyTown)) {$MyTown = "Munich"};
>
> Hier ein paar Beispiele:
> $MyTown = 56;
> $MyTown ||= "Munich";
> print $MyTown => Ausgabe: 56
>
> $MyTown = 0;
> $MyTown ||= "Munich";
> print $MyTown => Ausgabe: Munich
>
> [... mehr gute Beispiele]

Vielen Dank, ist jetzt klar!
Parallel wurde ich von PJH auf perldoc verwiesen:

1. **= += *= &= <<= &&=
2. -= /= |= >>= ||=
3. .= %= ^= //=
4. x=

Wenn ich oben Uwes Beispiel richtig interpretiere,
dann wᅵren diese beiden Ausdrᅵcke ...

$var1 ||= 'test1';
$var1 &&= 'test1';

... identisch. Liege ich da richtig?

Gruᅵ,
Peter

PS; Uwe, sorry fᅵr die PM!

Oliver 'ojo' Bedford

unread,
Nov 22, 2009, 6:55:31 AM11/22/09
to
Am Sat, 21 Nov 2009 18:27:21 +0100 schrieb Peter J. Holzer:


> Versuche, ein minimales Programm zu erstellen, bei dem der Fehler
> auftritt.

#!/usr/bin/perl

use feature 'switch';
use strict;
use warnings;

my $fi;
my %output_records;
my $format = 'Text';

%output_records = (
'one' => [
'two',
{
'1.' => '2.'
}
] );

given ($format) {
when (/Text/) {


foreach ( sort( keys( %output_records ) ) ) {
$fi = $_;
foreach ( sort(keys( %{$output_records{$fi}[1]} ) ) ) {
}
}
}
}

print;

führt zu:
ojo@hermes:~/Dokumente/Projekte/tkscan2pdf$ ./freeunref.pl
Attempt to free unreferenced scalar: SV 0x2357c40, Perl interpreter: 0x2353010 at ./freeunref.pl line 28.
Use of uninitialized value $_ in print at ./freeunref.pl line 28.

Oliver

Paul Hink

unread,
Nov 22, 2009, 3:31:02 PM11/22/09
to
Peter Velan <news-...@7fun.de> wrote:

> Wenn ich oben Uwes Beispiel richtig interpretiere, dann w�ren diese
> beiden Ausdr�cke ...


>
> $var1 ||= 'test1';
> $var1 &&= 'test1';
>
> ... identisch. Liege ich da richtig?

Einfach mal ausprobieren:

| $ perl -e '$var1 ||= "test1"; print ">>$var1<<\n";'
| >>test1<<
| $ perl -e '$var1 &&= "test1"; print ">>$var1<<\n";'
| >><<
| $

'$var1 ||= "test1";' entspricht '$var1 || ($var1 = "test1");'

'$var1 &&= "test1";' entspricht '$var1 && ($var1 = "test1");'

Peter Velan

unread,
Nov 22, 2009, 5:54:44 PM11/22/09
to
am 22.11.2009 21:31 schrieb Paul Hink:
> Peter Velan <news-...@7fun.de> wrote:
>
>> Wenn ich oben Uwes Beispiel richtig interpretiere, dann wᅵren diese
>> beiden Ausdrᅵcke ...

>>
>> $var1 ||= 'test1';
>> $var1 &&= 'test1';
>>
>> ... identisch. Liege ich da richtig?
>
> Einfach mal ausprobieren:

Hast Recht, grau ist alle Theorie!

> | $ perl -e '$var1 ||= "test1"; print ">>$var1<<\n";'
> | >>test1<<
> | $ perl -e '$var1 &&= "test1"; print ">>$var1<<\n";'
> | >><<
> | $
>
> '$var1 ||= "test1";' entspricht '$var1 || ($var1 = "test1");'
>
> '$var1 &&= "test1";' entspricht '$var1 && ($var1 = "test1");'

Ok, nach eigenen Versuchen ist mir das jetzt klarer und ich sehe auch
auch fᅵr &&= interessante Einsatzfᅵlle, allerdings muss (im Gegensatz
zu "||=") bei der Zuweisung "&&=" die Variable $var1 vorher definiert
sein.

#!/usr/bin/perl -w -s

$var1 &&= 'test1';
print ">>$var1<<\n";

$var2 ||= 'test2';
print ">>$var2<<\n";

Use of uninitialized value $var1 in concatenation (.) or string at
./assign.pl line 4.

Danke an alle,
Peter

Robert Berghaus

unread,
Nov 23, 2009, 8:32:11 AM11/23/09
to
Hallo Oliver

Bei mir kommt nur die letzte Fehlermeldung:
robert@siduxbox:~/Container/prj/Perl-Testsachen$ ./freeunref.pl
Use of uninitialized value $_ in print at ./freeunref.pl line 32.
robert@siduxbox:~/Container/prj/Perl-Testsachen$ perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi

Dann habe ich den Source etwas verändert:

[...]
] );

$_ = "";

given ($format) {
[...]

Jetzt kommt keine Fehlermeldung mehr, aber es wird auch nichts
ausgegeben (bzw. der Leerstring). Wenn ich da einen Text reinsetze,
wird dieser ausgegeben.

Vielleicht hilft das ja bei der weiteren Analyse.

Grüße aus dem grauen Bergischen Land
Robert


Oliver 'ojo' Bedford schrieb:

Peter J. Holzer

unread,
Nov 23, 2009, 4:55:18 PM11/23/09
to
On 2009-11-22 11:55, Oliver 'ojo' Bedford <new...@web.de> wrote:
> Am Sat, 21 Nov 2009 18:27:21 +0100 schrieb Peter J. Holzer:
>> Versuche, ein minimales Programm zu erstellen, bei dem der Fehler
>> auftritt.
>
> #!/usr/bin/perl
[h�bsches kleines testscript]
>
> f�hrt zu:

> ojo@hermes:~/Dokumente/Projekte/tkscan2pdf$ ./freeunref.pl
> Attempt to free unreferenced scalar: SV 0x2357c40, Perl interpreter: 0x2353010 at ./freeunref.pl line 28.
> Use of uninitialized value $_ in print at ./freeunref.pl line 28.

Wunderbar. Bug tritt bei mir auch auf, mit perl 5.10.1 allerdings (wie
bei Robert) nicht mehr:

% perl5.10.0 ojo
Attempt to free unreferenced scalar: SV 0x9fe00b8 at ojo line 28.
Use of uninitialized value $_ in print at ojo line 28.

% perl5.10.1 ojo
Use of uninitialized value $_ in print at ojo line 28.

Offenbar ist der Bug in 5.10.1 gefixt.

hp

Peter J. Holzer

unread,
Nov 28, 2009, 8:47:17 AM11/28/09
to
On 2009-11-22 22:54, Peter Velan <news-...@7fun.de> wrote:
> Ok, nach eigenen Versuchen ist mir das jetzt klarer und ich sehe auch
> auch f�r &&= interessante Einsatzf�lle, allerdings muss (im Gegensatz

> zu "||=") bei der Zuweisung "&&=" die Variable $var1 vorher definiert
> sein.

Nein.


> #!/usr/bin/perl -w -s
>
> $var1 &&= 'test1';
> print ">>$var1<<\n";
>
> $var2 ||= 'test2';
> print ">>$var2<<\n";
>
> Use of uninitialized value $var1 in concatenation (.) or string at
> ./assign.pl line 4.

Die Warnung kommt daher, dass Du versuchst, den Wert �undef� zu drucken.
Mit &&= hat das nichts zu tun.

hp

Peter J. Holzer

unread,
Nov 28, 2009, 8:45:21 AM11/28/09
to
On 2009-11-22 20:31, Paul Hink <paul-...@hink.name> wrote:
> '$var1 ||= "test1";' entspricht '$var1 || ($var1 = "test1");'
>
> '$var1 &&= "test1";' entspricht '$var1 && ($var1 = "test1");'

Mir f�llt zwar momentan kein Fall ein, wo sich das Ergebnis
unterscheiden w�rde, aber das ist eine ausgesprochen unpraktische Art,
||= und &&= zu beschreiben.


$var1 += $var2; entspricht $var1 = ($var1 + $var2); nicht $var1 + ($var1 = $var2);
$var1 -= $var2; entspricht $var1 = ($var1 - $var2); nicht $var1 - ($var1 = $var2);
$var1 *= $var2; entspricht $var1 = ($var1 * $var2); nicht $var1 * ($var1 = $var2);
$var1 |= $var2; entspricht $var1 = ($var1 | $var2); nicht $var1 | ($var1 = $var2);
$var1 &= $var2; entspricht $var1 = ($var1 & $var2); nicht $var1 & ($var1 = $var2);
...

daher gilt auch:

$var1 ||= $var2; entspricht $var1 = ($var1 || $var2); nicht $var1 || ($var1 = $var2);
$var1 &&= $var2; entspricht $var1 = ($var1 && $var2); nicht $var1 && ($var1 = $var2);

hp

0 new messages