Zum Inhalt springen

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


bigred2010

Empfohlene Beiträge

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

&&

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

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...