Martin the Newbie: if schleife die nicht macht was ich will !!!

hallo alle zusammen,
ich bins mal wieder!

vielleicht könnt ihr mir ja erklären warum diese schleife nicht das macht was sie soll:

BEGINN PROG:
read (STDIN, $auswahl, $ENV{'CONTENT_LENGTH'});
%auswahl = &CGIDA ($auswahl);
while (($temp2, $temp1) = each %auswahl)
    {
        if ($temp1 =~m/\d{2}.\d{2}.\d{2}/g)
        {
            $temp = $temp1;
        }
        else
        {
            die "Kein Datum eingegeben"
        }
    }
END PROG:

also ich lese einen string aus einem formular ein, lassen ihn durch eine subroutine laufen die mir das &Zeichen trennt (feld von daten trennen!) und geb ihn als hash zurück.
in temp2 steht der feldname in temp1 der feldinhalt (soll ein Datum werden!).
nun lasse ich das datum mit einem suchmuster auf sein format prüfen.
IF das suchmuster wahr zurück liefert soll er temp1 zu temp machen. (muss ich das überhaupt so umständlich lösen???)
ELSE soll er das programm sterben lassen.

nun zu meinen prüfschritten:
als erstes hab ich mal statt der die anweisung eine variable mit text gehabt "Kein Datum eigegeben blabla"

als test lass ich mir die variblen auf einer html seite ausgeben.
folgende ergebnisse:

$temp liefert tatsächlich das Datum wenn ich Ziffern eingebe.
(nur mit dem {2} kommt er nicht klar als ich einmal 4 stelliges jahr eingegeben habe kam das datum auch raus. allerdings laesst er keine Buchstaben zu dann ist $temp leer)

$temp1 ist leer (ähm wie kann dann $temp das datum zurück liefern? eins der mysterien die ich nicht verstehe)

$err die variable die ich vor dem die befehl benutzt habe wurde jedesmal mit ausgegeben ob if nun wahr war oder nicht. demnach bricht das prog jetzt auch an dieser stelle ab. und wie kann er sowohl $temp (also if=wahr) als auch $err (also if=unwahr)ausgeben.

vielleicht hab ich ja noch nicht die grundlegende funktion einer solchen schleife kapiert!!!!

bitte klärt mich auf(über die schleifen meine ich)

THX im vorraus euer newbie;-)

  1. Hi,

    vielleicht könnt ihr mir ja erklären warum diese schleife nicht das macht was sie soll:

    weil sie suboptimal ist.

    read (STDIN, $auswahl, $ENV{'CONTENT_LENGTH'});
    %auswahl = &CGIDA ($auswahl);

    Wech damit.

    use CGI ':standard';
    my $datum = param('datum');

    Damit sparst Du Dir auch die while-Schleife.

    while (($temp2, $temp1) = each %auswahl)

    Hast Du testweise mal $temp2, $temp1 ausgegeben?

    {
            if ($temp1 =~m/\d{2}.\d{2}.\d{2}/g)

    Das /g ist übrigens überflüssig.

    {
                $temp = $temp1;
            }
            else
            {
                die "Kein Datum eingegeben"
            }

    Tja. Wenn man mal einfach davon ausgeht, daß der erste Schritt in while den else-Teil anspricht (ansonsten tut es halt der zweite oder dritte), läßt sich die Schleife reduzieren auf:

    while (...) {
      die "Kein Datum eingegeben"
    }

    Wunderst Du Dich noch immer, daß sie abbricht? ;-)

    IF das suchmuster wahr zurück liefert soll er temp1 zu temp machen. (muss ich das überhaupt so umständlich lösen???)

    Was ist daran umständlich? Aber okay, nimm einfach

    my $temp = ($temp1 =~ /\d.../) ? $temp1 : '';

    Und das ist schon die ausführliche Variante :-)

    ELSE soll er das programm sterben lassen.

    Jepp. Bei _jedem_ Eingabepaar. Es muß also _überall_ ein Datum eingegeben sein, wobei in Deiner Variante nur das letzte Datum gespeichert ist.

    folgende ergebnisse:

    Wenn's klappt, hast Du z.B. "Ich habe am 17.09.1974 Geburtstag." in $temp stehen.

    (nur mit dem {2} kommt er nicht klar als ich einmal 4 stelliges jahr eingegeben habe kam das datum auch raus.

    \d{2,4} (erlaubt allerdings auch "347")
    \d{2}\d{2}?

    allerdings laesst er keine Buchstaben zu dann ist $temp leer)

    Doch doch, er erlaubt Buchstaben. Nur eben nicht innerhalb des Datums.

    $temp1 ist leer (ähm wie kann dann $temp das datum zurück liefern? eins der mysterien die ich nicht verstehe)

    $temp1 ist das letzte aus dem %Hash, $temp das letzte gefundene Datum.

    $err die variable die ich vor dem die befehl benutzt habe wurde jedesmal mit ausgegeben ob if nun wahr war oder nicht. demnach bricht das prog jetzt auch an dieser stelle ab. und wie kann er sowohl $temp (also if=wahr) als auch $err (also if=unwahr)ausgeben.

    Es war einfach zu verschiedenen Zeitpunkten :-)

    vielleicht hab ich ja noch nicht die grundlegende funktion einer solchen schleife kapiert!!!!

    Scheint so *g*
    Jede Schleife wird solange durchlaufen, bis sie abbricht. Sei es durch "die" oder durch die definierte Abbruchbedingung. Variablen haben den Zustand der letztgemachten Änderung.

    Noch Fragen, Kienzle? :-)

    Cheatah