bigred2010 Geschrieben 16. Juli 2008 Teilen Geschrieben 16. Juli 2008 (bearbeitet) Hi @all, mir ist gerade was verwunderliches aufgefallen. Bei einer mini if-Abfrage wollte ich Testen ob die Variable gefüllt ist oder nicht je nach dem soll OK oder FALSE ausgegeben werden: #!/usr/bin/perl $id="0" ; if ($id) { print "OK"; } else { print "FALSE"; } Das Komische ist nur, wenn die Variable $id mit 0 gefüllt ist, dann bekomme False, mit alle anderen Zahlen OK, wie kann ich die Abfrage so stellen, dass nur überprüft wird ob die Variable gefüllt ist oder nicht? Mit Funktion defined hat es nicht funktioniert?! Ich hab auch folgendes Probiert, aber es klappt trotzdem nicht:#!/usr/bin/perl $id="0" ; if ($id != "" ) { print "OK"; } else { print "FALSE"; } Bearbeitet 16. Juli 2008 von bigred2010 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lordy Geschrieben 16. Juli 2008 Teilen Geschrieben 16. Juli 2008 if (defined($id)) { ... } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigred2010 Geschrieben 16. Juli 2008 Autor Teilen Geschrieben 16. Juli 2008 (bearbeitet) Ich glaub ich hab mich fals ausgedrückt. Also mit defined klaptt das, wenn die Variable $id=0 ist, dann bekomme ich ok. Aber wenn die Variable $id="" ist, dann bekomme ich trotzdem ok und das soll es nicht. Ich möchte FALSE ausgeben wenn die Variable leer ist, wie kann ich das Prüfen? Bei Folgender Abfrage bekomme ich ok?!#!/usr/bin/perl $id="" ; if (defined($id)) { print "OK\n" ; } else { print "FALSE\n"; } Bearbeitet 16. Juli 2008 von bigred2010 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lordy Geschrieben 16. Juli 2008 Teilen Geschrieben 16. Juli 2008 Warum setzt du sie denn auf intial auf "" ? Ich versteh den Hintergrund irgendwie nicht... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigred2010 Geschrieben 16. Juli 2008 Autor Teilen Geschrieben 16. Juli 2008 Es ist ein größeres Skript, und ich will irgendwann wissen ob die Variable $id gesetzt wurde oder nicht, und wenn die Variable nicht gesetzt wurde, dan ist ist ja "" und das muss ich dann Prüfen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigred2010 Geschrieben 16. Juli 2008 Autor Teilen Geschrieben 16. Juli 2008 Ok, ich habs: if ($id =~ /[0-9]+/ ) {print "OK" ; } else { print "FALSE\n"; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr Unix Geschrieben 19. Juli 2008 Teilen Geschrieben 19. Juli 2008 Ok, ich habs: if ($id =~ /[0-9]+/ ) {print "OK" ; } else { print "FALSE\n"; } Du solltest auf use strict; und use warnings; nicht verzichten. Ein Pattern Match auf eine undefinierte Variable ist nicht schoen und kann boese enden. :old Grundsaetzlich unterscheidest du mit defined() ob eine Variable nicht undef ist (mehr dazu unter perldoc -f defined): perl -Mstrict -wle 'my $id=0; print defined $id ? "OK" : "FALSE"' Dagegen unterscheidest du mit der einfachen if-Abfrage ob eine Variable einen Wert ungleich 0 oder undef hat. perl -Mstrict -wle 'my $id=0; print $id ? "OK" : "FALSE"' Folglich solltest du, wenn du ueberpruefen willst, ob deine Variable eine Zahl enthaelt so vorgehen: if($id && $id=~/^\d+\z/){ ... } Mehr dazu unter man perlstyle. :mod: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigred2010 Geschrieben 20. Juli 2008 Autor Teilen Geschrieben 20. Juli 2008 Du solltest auf use strict; und use warnings; nicht verzichten. Ein Pattern Match auf eine undefinierte Variable ist nicht schoen und kann boese enden. :oldWas ist daran nicht schön und warum soll das böse Enden? Ich verstehe das jetzt nicht ganz. Wenn es sich um eine Zahl handelt, dann ist das OK, wenn nicht, dann FALSE fertig. Folglich solltest du, wenn du ueberpruefen willst, ob deine Variable eine Zahl enthaelt so vorgehen: if($id && $id=~/^\d+\z/){ ... }Du machst doch nichts anders als ich, nur anders herum?! Nur das du halt jetzt noch if ($id) eingesetzt hast. Bitte um nähere Erklärungen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
starbuck86 Geschrieben 5. September 2008 Teilen Geschrieben 5. September 2008 (bearbeitet) Da ist schon ein Unterschied. Mit deiner Suche könntest du auch finden "aaaaaabbbbbb2bbbbbbbbeeeeee". Eure beiden Antworten kombiniert + X könntest Du schreiben: if ( $id && $id =~ m/^[0-9]+\z/ && $id !~ m/^[a-zA-Z]\z/ ) { ... } Dabei definieren: ^ = Stringanfang == .$id \z = Stringende == $id. Bearbeitet 5. September 2008 von starbuck86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr Unix Geschrieben 5. September 2008 Teilen Geschrieben 5. September 2008 Eure beiden Antworten kombiniert + X könntest Du schreiben: if ( $id && $id =~ m/^[0-9]+\z/ && $id !~ m/^[a-zA-Z]\z/ ) { ... } Wozu? Da ist eine Abfrage zuviel. Wenn ein m/^\d+\z/ bereits getroffen hat, dann braucht man nicht mehr ueberpruefen ob es nun \w enthaelt oder nicht. Das waere doppelt gemoppelt. Keine numerischen Daten: % perl -wle '$_="123abc456"; print "zahl" if m#^\d+\z#' Numerische Daten: % perl -wle '$_="123456"; print "zahl" if m#^\d+\z#' zahl Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
starbuck86 Geschrieben 8. September 2008 Teilen Geschrieben 8. September 2008 Ok verstehe. Also sagt '=~ m#^\d+\z#' aus, dass von Zeilenanfang bis Zeilenende nur Ziffern enthalten sein dürfen, wohingegen '=~ m#\d+#' auch sonstige Zeichen enthalten dürfte, damit die Bedingung wahr wird?! BTW: Sag mal UNIX, wie lange programmierst Du denn schon in Perl?? Ist echt mal ne Anerkennung wert, wenn ich Deine Antworten zu diversen Perl-Fragen hier im Forum lese. && Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr Unix Geschrieben 8. September 2008 Teilen Geschrieben 8. September 2008 Also sagt '=~ m#^\d+\z#' aus, dass von Zeilenanfang bis Zeilenende nur Ziffern enthalten sein dürfen, wohingegen '=~ m#\d+#' auch sonstige Zeichen enthalten dürfte, damit die Bedingung wahr wird?! Die erste Regexp bedeutet "Von Anfang bis Ende muss mindestens eine (oder mehrere) Zahlen enthalten sein". Die zweite steht lediglich dafuer, dass irgendwo im String eine Zahl vorkommen muss. BTW: Sag mal UNIX, wie lange programmierst Du denn schon in Perl?? Seit Perl 5.004 - Also etwa 11 Jahre. mfg Unix Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.