Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8110[/thread]

Fehlermeldung die nicht da sein duerfte..

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Aleks
 2006-06-26 17:00
#67624 #67624
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen,
in einem Programm bekomme ich die allseits beliebte Meldung use of uninitial... . Nur dürfte die eigentlich gar nicht kommen.. Hier die dafür wichtigen teile der Funktion die mir Ärger macht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sub test_dns_in_spectrum{
...
foreach my $name (keys %DNS_Data_ntoa){
$status = 0;
unless (exists $Spectrum_Data_ntoa{$name} ){$status += 1;};
...
# Hier teste ich ob es auch in dem %Spec.. einen Schlüssel
# $name gibt und falls das nicht so ist wird $status incrementiert.
if ($status == 3){
...
next;
} elsif ($status == 2){
....
next;
} elsif ($status == 1){
... # existiert der Schlüssel nicht, wird hier die nächste iteration gestartet. Das Programm läuft also nicht weiter...
next;
}

if ( ($DNS_Data_ntoa{$name} eq $Spectrum_Data_ntoa{$name}) && \ # und hier kriege ich den Fehler!
($DNS_Data_aton{$DNS_Data_ntoa{$name}} eq $Spectrum_Data_aton{$Spectrum_Data_ntoa{$name}}) ){
next;
} else {
....
}
}
}


Ich fasse mal kurz meinen Gedankengang zusammen:
1) $name muss != undef sein wegen foreach (keys...; außerdem hätte ich dann vorher schon eine warnung kriegen müssen (beim initialisieren).
2) $DNS_Data_ntoa{$name} muss != undef sein, siehe 1.
3) $Spectrum_Data_ntoa{$name} wird ja vorher geprüft! muss also auch != undef sein, weil sonst ja $status != 0 wäre und die Schleife per next in die nächste Iteration geschickt wird, also nicht beim Auswerten des Ausdrucks in der If Anweisung ankommt...
Ich beziehe mich hier auf die Schlüssel (exists())! Also das der Schlüssel existiert, ich meine nicht undef als value der Schlüssel.

Weiß jemand wie das sein kann? Ich hab irgendwie ein Brett vorm Kopf...

Ach ja, selbstverständlich lade ich als erstes strict,warnings und diagnostics. Ein Test mit defined() auf die Werte der Schlüssel bringt dasselbe Ergebnis.

Gruß,
Aleks
pq
 2006-06-26 17:14
#67625 #67625
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
poste doch bitte die ganze fehlermeldung. sie enthält die zeile und noch ein
klein bißchen mehr info.
ich vermute, dass einer der beiden vergleichsoperanden von 'eq' undef ist.\n\n

<!--EDIT|pq|1151327720-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2006-06-26 17:19
#67626 #67626
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Benutzt Du Wiki:use strict?

Spectrum_Data_ntoa{$name} wird vorher nicht überprüft oder Du hast die entsprechende Stelle nicht gepostet. Du hast nur ganz am Anfang das unless aber der eq-Abgleich ist auf der gleichen Ebene wie das unless...

Teste doch einfach mal, welche Variable Dir die Warnung besorgt...

Mach einfach ein
Code: (dl )
1
2
 print "NAME: ~$name~\nDNS_ntoa: ~$DNS_Data_ntoa{$name}~\n";
print "Spectrum: ~$Spectrum_Data_ntoa{$name}~ ...\n";
vor dem if-Teil...\n\n

<!--EDIT|renee|1151327983-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Aleks
 2006-06-26 17:21
#67627 #67627
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hi,
hier die gesamte Fehlermeldung:

Use of uninitialized value in string eq at ./cstdd.pl line 341 (#1)
(W uninitialized) An undefined value was used as if it were already
defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
To suppress this warning assign a defined value to your variables.

To help you figure out what was undefined, perl tells you what operation
you used the undefined value in. Note, however, that perl optimizes your
program and the operation displayed in the warning may not necessarily
appear literally in your program. For example, "that $foo" is
usually optimized into "that " . $foo, and the warning will refer to
the concatenation (.) operator, even though there is no . in your
program.

Die Zeilennummer stimmt natürlich nicht, es ist halt in der If Anweisung.. Das einer der Werte undef ist habe ich auch vermutet und darauf hin so getestet:

Code: (dl )
unless ( (exists $Spectrum_Data_ntoa{$name}) && (defined $Spectrum_Data_ntoa{$name}) ){$status += 1;};


Das hätte ja im Fall eines undef value anschlagen müssen, macht es aber ned.. :-/

thx,
aleks
pq
 2006-06-26 17:39
#67628 #67628
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
das "Use of uninitialized value in string eq" sagt dir:
entweder $DNS_Data_aton{$DNS_Data_ntoa{$name}} oder
$Spectrum_Data_aton{$Spectrum_Data_ntoa{$name}} ist undef.
mit exists() auf definiertheit zu prüfen ist übrigens ziemlich sinnfrei.
exists() prüft, ob der key existiert, nicht, ob was definiertes im value steht.
das prüfst du mit defined().
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2006-06-26 17:59
#67629 #67629
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ist ja gut, dass Du das so überprüfst, aber $status um eins zu erhöhen hat keinen Einfluss auf
Code: (dl )
1
2
if ( ($DNS_Data_ntoa{$name} eq $Spectrum_Data_ntoa{$name})  &&
($DNS_Data_aton{$DNS_Data_ntoa{$name}} eq $Spectrum_Data_aton{$Spectrum_Data_ntoa{$name}}) )
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Aleks
 2006-06-26 18:36
#67630 #67630
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hallo pq,
das weiß ich alles und hab es auch dabei geschrieben..
Wo prüfe ich den mit exists auf einen definierten Wert? Vielleicht habe ich mich nicht klar genug ausgedrückt...:

$name enthält einen dns hostnamen. Der Wert des jeweiligen Schlüssel ist die ip. Nun möchte ich testen ob es in unserem NM System ebenfalls einen host mit diesem namen gibt. Daher ist es völlig unerheblich welchen Wert diese Schlüssel haben. Wichtig ist ersteinmal nur ob es sie gibt! Es macht also keinen Sinn mit defined zu prüfen. ich will ja wissen ob derselbe key (host) in beiden Systemen (hashes) vorkommt. Defined bringt mir daher nix... In meinem Konstruckt ist es so das es keine undef Werte für Schlüssel geben kann. Das Problem bei dieser Sache liegt eher darin das ich versuche einen Schlüssel in einem Hash anzusprechen den es dort einfach nicht gibt, weshalb ich auch die Fehlermeldng bekomme... War das deutlicher?
Aleks
 2006-06-26 18:49
#67631 #67631
User since
2006-06-12
19 Artikel
BenutzerIn
[default_avatar]
Hi renee,
offensichtlich hast Du Recht, aber warum?

$status wird ja am Anfang incrementiert, wenn der Schlüssel nicht gefunden wird. Dann kommt einen if else Anweisung die $status auswertet. Wenn $status z.B. 1 ist (der Schlüssel wurde also nicht gefunden) soll ein next() ausgeführt werden. Die Schleife muss dann also von vorne beginnen und die dannach folgende if Anweisung in der das 'eq' ausgeführt wird überspringen (weil das next ja schon vorher steht). Beim 'if x eq y' dürfte das Programm also eigentlich überhaupt nicht ankommen. Was es aber offensichtlich tut. Nur warum verstehe ich nicht. Wenn man in mein erstes Post sieht dann wird der Programmfluss deutlicher:

1) prüfe ob der schlüssel existiert - wenn nicht erhöhe $status
2) wenn $status einem wert entspricht, der schlüssel also nicht in beiden hashes existiert, dann loge das und führe next() aus. womit ja der gesamte folgecode irrelevant sein sollte.
3) schlagen die if anweisungen aus 2 nicht an ist $status auf 0. d.h. in beiden hashes existiert ein schlüssel mit gleichem namen. jetzt soll geprüft werden ob der schlüssel in beiden hashes denselben wert hat.

Das mit der ausgabe habe ich auch mal probiert. leider ist die ausgabe sehr groß... und ich war müde.. mir bleibt aber wohl nix anderes übrig als mir dann alles mal anzusehen..
Crian
 2006-06-26 19:02
#67632 #67632
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Springst du vielleicht mit next an eine andere Stelle zurück als du denkst? Eventuell mal ein label setzen testweise.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2006-06-26 19:14
#67633 #67633
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@aleks: ich sagte: entweder $DNS_Data_aton{$DNS_Data_ntoa{$name}} oder
$Spectrum_Data_aton{$Spectrum_Data_ntoa{$name}} ist undef.
du prüfst aber nur $Spectrum_Data_ntoa{$name}.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2006-06-26 17:00.