Reguläre Ausdrücke in Variabeln
Hansi
- perl
Hallo,
ich lese ein Datum aus und überprüfe dieses mit
$ok = ($timedate =~ /^(\d\d/\d\d/\d\d)/o);
ist die Formatierung gültig, dann ist &ok=1 wenn nicht dann ist $ok=0. In der obigen Syntax ist alles im grünen Bereich.
Tatsächlich werden natürlich Parameter noch eingefügt, um zu überprüfen ob $timedate mit dem übergebenen Datum übereinstimmt. Das sieht wie folgt aus:
$ok = ($timedate =~ /^($FORM{'day'}/$FORM{'month'}/$FORM{'year'})/o);
So werden nun die an das Skript übergebenen Parameter in den Ausdruck eingefügt und ausgewertet. Funktioniert auch, SOFERN ein Wert übergeben wurde.
Möglich wäre z.B. daß der Tag nicht eingegeben wurde, weil ich die Filterung der Daten auf den Moant erweitern möchte. Nun habe ich mir folgendes überlegt.
Ich überprüfe die Parameter auf Werte und wenn kein Wert enhalten ist, dann übergebe ich eben die Patzhalter.
if ($FORM{'day'})
{
$parday = $FORM{'day'};
}
else
{
$parday = "\d\d";
}
if ($FORM{'month'})
{
$parmonth = $FORM{'month'};
}
else
{
$parmonth = "\d\d";
}
if ($FORM{'year'})
{
$paryear = $FORM{'year'};
}
else
{
$paryear = "\d\d";
}
$ok = ($timedate =~ /^($parday/$parmonth/$paryear)/o);
Das funktioniert aber nicht, weil ja die Zeichenfolgen \d\d als String in die Parameter eingeügt werden.
Und nun die Frage wie kann ich die Ausdrücke in Variabeln übergeben?
Und nebenbei, was bedeutet das o am Ende des Ausdrucks? g, i und s kenne ich schon aber das ist für mich neu.
Es wäre super, wenn sich jemand erbarmen würde und mir dabei helfen könnte.
Vielleicht hat auch jemand einen Tip, wie man die Sache noch optimieren kann.
Im voraus auf jeden Fall schon einmal Danke für euere Unterstützung.
Hansi
Hi,
$ok = ($timedate =~ /^($FORM{'day'}/$FORM{'month'}/$FORM{'year'})/o);
So werden nun die an das Skript übergebenen Parameter in den Ausdruck eingefügt und ausgewertet. Funktioniert auch, SOFERN ein Wert übergeben wurde.Möglich wäre z.B. daß der Tag nicht eingegeben wurde, weil ich die Filterung der Daten auf den Moant erweitern möchte. Nun habe ich mir folgendes überlegt.
versuch's mit
... =~ /^(($FORM{'day'}\d\d)/...
if ($FORM{'day'})
{
$parday = $FORM{'day'};
}
else
{
$parday = "\d\d";
}
$parday = $FORM{'day'} "\d\d";
$ok = ($timedate =~ /^($parday/$parmonth/$paryear)/o);
Das funktioniert aber nicht, weil ja die Zeichenfolgen \d\d als String in die Parameter eingeügt werden.
Doch, die Variable wird geparsed. Ansonsten verwende ein eval()-Konstrukt, so daß die Variablen garantiert vorher aufgeschlüsselt werden.
Und nebenbei, was bedeutet das o am Ende des Ausdrucks? g, i und s kenne ich schon aber das ist für mich neu.
"Compile once", dadurch werden die Variablen nur einmal zur Laufzeit ersetzt (z.B. innerhalb von while). Laß es einfach weg. Ich benutze es auch nicht und weiß daher nicht, wie es reagiert; wenn man davon liest wird auch meistens empfohlen die Option nur zu verwenden, wenn man weiß, welche Auswirkungen das hat.
Cheatah
*Argh*
versuch's mit
... =~ /^(($FORM{'day'}\d\d)/...
Mein Gott, da hätte ich aber selbst drauf kommen können. Ist ja auch so in SelfHTML beschrieben!!! (mußte ich jetzt nicht mal überprüfen). Ich habs gelesen und gelesen und... aber nicht registriert, daß es meine Lösung ist.
Danke!!!
Hansi
Hallo Ihr zwei!
*Argh*
versuch's mit
... =~ /^(($FORM{'day'}\d\d)/...
Mein Gott, da hätte ich aber selbst drauf kommen können. Ist ja auch so in SelfHTML beschrieben!!! (mußte ich jetzt nicht mal überprüfen). Ich habs gelesen und gelesen und... aber nicht registriert, daß es meine Lösung ist.
[buzzzz] sieht ja sehr noach Zonk aus ;-)
Ich muß hier mal intervenieren. Das oben angegebene Statement für dummerweise nicht zum
gewünschten Erfolg:
angenommen ich übergebe in day eine 19: dann soll der Ausdruck auch nur mit 19/xx/yy matchen. In der obigen RE steht aber: "wenn die 19 nicht paßt, dann nimm wenigsten zwei Ziffern". Das ist ja sicherlich nicht gewünscht ...
Nehmt doch mal
... =~ /^($FORM{'day'}\b/?$FORM{'month'}\b/?$FORM{'year'})$/
Die / sind jetzt optional (durch ?). Werden also Tag UND Monat weggelassen, so wird aus
//1999 durch weglassen eines oder beider / ein passender Ausdruck.
Aber! Es ist wohl falsch, wenn alle / weggelassen werden können. Daher das zusätliche \b, welches mir Wortgrenzen zwischen den Zahlen erzwingt. Heißt soviel wie "Wenn Jahr und Monat, dann auch mit / dazwischen". Am Ende noch ein $, so daß bei weglassen von Tag und Monat das Jahr auch nur am Ende von TimeDate stehen kann.
Jörk
PS: Die Variante mit dem if-then-else war im Ansatz gar nicht so falsch. Jedoch wurde durch
$parmonth = "\d\d";
der text "dd" in $parmonth abgelegt :( Richtig wäre dann
$parmonth = "\d\d";
gewesen ... probiers doch mal