Zum Inhalt springen

Perl: Variable prüften ob Sie gefüllt ist oder nicht.


Empfohlene Beiträge

Geschrieben (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 von bigred2010
Geschrieben (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 von bigred2010
Geschrieben

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.

Geschrieben
  bigred2010 schrieb:
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:

Geschrieben
  Mr Unix schrieb:
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
Was 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.
  Mr Unix schrieb:
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.

  • 1 Monat später...
Geschrieben (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 von starbuck86
Geschrieben
  starbuck86 schrieb:
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:

  Zitat
% perl -wle '$_="123abc456"; print "zahl" if m#^\d+\z#'

Numerische Daten:

  Zitat
% perl -wle '$_="123456"; print "zahl" if m#^\d+\z#'

zahl

Geschrieben

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.

&&

Geschrieben
  starbuck86 schrieb:
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.

  starbuck86 schrieb:
BTW: Sag mal UNIX, wie lange programmierst Du denn schon in Perl??

Seit Perl 5.004 - Also etwa 11 Jahre.

mfg

Unix

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Weiterlesen  

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...