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
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
> 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.
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
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
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
http://perldoc.perl.org/perlop.html#Assignment-Operators
hp
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
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!
> 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
> 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");'
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
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:
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
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
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