Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

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.

Ok, ich habs:


if ($id =~ /[0-9]+/ )   {print "OK" ; }

else                    { print "FALSE\n"; }

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:

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.

  • 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

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

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.

&&

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.