PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler:Use of uninitialized value in addition (+) at ./wochentagberechnung



byron1778
19-06-2007, 12:24
Hallo Forum,
bei meinem Programm Wochentagsberechnung bekomme ich immer die Fehlermeldung: Use of uninitialized value in addition (+) at ./wochentagberechnung.pl line 105, <STDIN> line 3.

Ich habe mir schon die Zeilen immer wieder und wieder angesehen, auch ob ich doppelte Einträge vielleicht habe, aber leider komme ich nicht dahinter, wo mein Fehler liegen soll, bzw. auch welche Fährte mich der Hinweis bringen soll?

Wenn mir jemand einen Tipp geben könnte.

Danke vielmals.
Hier das Script!



#!/bin/perl -w

print "\n";
print "******************\n";
print "*Datumsberechnung*\n";
print "******************\n";
print "\n";

print "Eingabe des Tages (1 .. 31)\n";
print "***************************\n\n";

$tagesziffer = <STDIN>;

$ergebnis_aus_tagesziffer = $tagesziffer % 7;

print "Eingabe des Monats\n";
print "******************\n\n";

@array = qw { Jan Feb Mar Apr Mai Juni Juli Aug Sep Oct Nov Dec };

foreach (@array) {
print $_ . "\n";
}

$monatseingabe = <STDIN>;

if ("$monatseingabe" eq "Jan"){$ergebnis_aus_monatseingabe=0;
}
elsif ("$monatseingabe" eq "Feb"){$ergebnis_aus_monatseingabe=3;
}
elsif ("$monatseingabe" eq "Mar"){$ergebnis_aus_monatseingabe=3;
}
elsif ("$monatseingabe" eq "Apr"){$ergebnis_aus_monatseingabe=6;
}
elsif ("$monatseingabe" eq "Mai"){$ergebnis_aus_monatseingabe=1;
}
elsif ("$monatseingabe" eq "Juni"){$ergebnis_aus_monatseingabe=4;
}
elsif ("$monatseingabe" eq "Juli"){$ergebnis_aus_monatseingabe=6;
}
elsif ("$monatseingabe" eq "Aug"){$ergebnis_aus_monatseingabe=2;
}
elsif ("$monatseingabe" eq "Sep"){$ergebnis_aus_monatseingabe=5;
}
elsif ("$monatseingabe" eq "Oct"){$ergebnis_aus_monatseingabe=0;
}
elsif ("$monatseingabe" eq "Nov"){$ergebnis_aus_monatseingabe=3;
}
elsif ("$monatseingabe" eq "Dec"){$ergebnis_aus_monatseingabe=5;
}

print "Das Jahr eingeben\n";
$jahr=<STDIN>;
print "\n";

#Jahresziffer extrahieren

$jahresziffer = substr($jahr,2);

$ergebnis_aus_jahresziffer = ($jahresziffer + $jahresziffer / 4) % 7;

#Jahrhundertziffer extrahieren und berechnen

$ergebnis_aus_jahrhundertziffer = ($jahr % 4 - 3) * (-2);

$ist_schaltjahr = ($jahr % 4 == 0) && ($jahr % 100 != 0) || ($jahr % 400 == 0);

if (! $ist_schaltjahr)
{
$ergebnis_aus_schaltjahr = 0;
print "Kein Schaltjahr\n";
}
else
{print "Ist ein Schaltjahr\n\n";
$ergebnis_aus_schaltjahr = 6;}

$ende=($ergebnis_aus_tagesziffer)+($ergebnis_aus_m onatseingabe)+($ergebnis_aus_jahresziffer)+($ergeb nis_aus_jahrhundertziffer)+($ergebnis_aus_schaltja hr);

print "$ende\n";

jan61
19-06-2007, 19:59
Hallo Forum,
bei meinem Programm Wochentagsberechnung bekomme ich immer die Fehlermeldung: Use of uninitialized value in addition (+) at ./wochentagberechnung.pl line 105, <STDIN> line 3.
...

Wenn ich mir Deinen Code ausschneide und in eine Datei packe, dann hat sie nur 79 Zeilen. Was in Zeile 105 passiert, kann ich also leider nicht erkennen.

Es ist aber immer eine gute Idee, an den Anfang des Perl-Scripts ein use strict; zu setzen, damit stellst Du sicher, dass Du nur definierte Variablen benutzt. Diese musst Du dann mit my $variable; zumindest deklarieren.

Mir sind verschiedene Stellen aufgefallen, an denen Du nicht sicherstellst, dass eine von Dir benutzte Variable auch definiert wird:

Du rechnest mit $tagesziffer ohne zu prüfen, ob da überhaupt ein sinnvoller Wert drin steht.

Die if-elsif-Schleife für $ergebnis_aus_monatseingabe z. B. hat kein else. Es kann also sein, dass diese Variable überhaupt nicht definiert wird.

Du bildest $jahresziffer aus einer Eingabe, prüfst aber wiederum nicht ab, ob Deine Eingabe überhaupt eine passende Jahresziffer liefert.

Insgesamt: Alle Eingaben von außen sind böse - ganz böse! Du musst IMMER prüfen, ob sie einen Wert enthalten, der gültig ist, bevor Du sie weiterverwendest.

Jan

reneeb
01-07-2007, 14:40
Meiner Meinung nach gehört in jedes Skript use strict (wiki.perl-community.de/bin/view/Wissensbasis/UseStrict). Damit kann man schon viele Fehler von vornherein ausschließen weil Schreibfehler bei Variablennamen gleich angemeckert werden. Das ist häufig eine Fehlerursache...