Jonny: Perl

Halli hallo,

weiß jemand wie man eine Varible prüfen kann, ob sie einen String oder eine Zahl enthält?

Gruß,
Jonny

  1. Hallo Jonny,

    weiß jemand wie man eine Varible prüfen kann, ob sie einen String oder eine Zahl enthält?

    Am Besten überprüfst Du dies mit einem regulären Ausdruck. Aber Vorsicht! Eine Zahl kann man auf verscheidene Weisen darstellen. Hier ein paar Beispiele:

    warn "Keine reine Zahl" if /\D;
    warn "Keine natürliche Zahl" unless /^\d+$/; # verwirft -3
    warn "Keine Integerzahl" unless /^-?\d+$/;   # verwirft +3
    warn "Keine Integerzahl" unless /[1]?\d+$/;

    Dann gibt es noch Dezimalzahlen, und, und, und.

    Gruß
    Helmut Weber

    --
    -------------------------------------------
    Mode ist eine Variable, Stil eine Konstante

    1. +- ↩︎

    1. Hallo Helmut,

      warn "Keine reine Zahl" if /\D;
      warn "Keine natürliche Zahl" unless /^\d+$/; # verwirft -3
      warn "Keine Integerzahl" unless /^-?\d+$/;   # verwirft +3
      warn "Keine Integerzahl" unless /[1]?\d+$/;

      Oh das ist viel. Mein Ziel ist, dass ein Perlskript mit Parameter gestartet werden soll. Der Parameter muss zwingend eine Zahl sein, wenn aber versehentlich ein Buchstabe eingetippt wird, soll eine Fehlmeldung ausgegeben werden. Könnte ich das auch so prüfen:

      warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;

      ???

      Gruß,
      Jonny


      1. +- ↩︎

      1. hallo Jonny,

        warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;

        Viel zu umständlich und übrigens sogar falsch. Parameter erhältst du doch mit
          $ENV{'QUERY_STRING'}
        oder? Dann prüfst du eben, ob QUERY_STRING eine Ziffer (es gibt _erhebliche_ Unterschiede zwischen "Ziffern" und "Zahlen") ist und gibst, falls das _nicht_ der Fall ist, deine Fehlermeldung aus.

        Grüße aus Berlin

        Christoph S.

        1. Hallo,

          ... Parameter erhältst du doch mit
            $ENV{'QUERY_STRING'}

          Vielleicht gehst Du ja von den falschen Voraussetzungen aus. Ich habe

          Mein Ziel ist, dass ein Perlskript mit Parameter gestartet werden soll.

          so interpretiert, dass er das Script über eine Shell/Commandline-Tool aufruft.
          In diesem Falle wäre es sinnvoller @ARGV zu analysieren.

          Grüße
            Klaus

          1. hallo,

            $ENV{'QUERY_STRING'}
            Vielleicht gehst Du ja von den falschen Voraussetzungen aus.

            Deshalb stand ja das "oder?" in meinem posting ;-)

            Ich habe

            Mein Ziel ist, dass ein Perlskript mit Parameter gestartet werden soll.
            so interpretiert, dass er das Script über eine Shell/Commandline-Tool aufruft.
            In diesem Falle wäre es sinnvoller @ARGV zu analysieren.

            Soll er beides probieren. Eines davon sollte das gewünschte Ergebnis liefern. Auf jeden Fall ist

            warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;

            nicht so recht nachvollziehbar und ganz gewiß zu umständlich.

            Grüße aus Berlin

            Christoph S.

            1. Tag Christoph.

              Auf jeden Fall ist

              warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;
              nicht so recht nachvollziehbar und ganz gewiß zu umständlich.

              Wie wäre es mal mit einem funktionierenden Lösungsansatz:

              warn "Der Parameter muss eine Zahl sein!" if /[1]+$/i;

              Siechfred

              --
              »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«

              1. ^0-9 ↩︎

              1. Hallo,

                Wie wäre es mal mit einem funktionierenden Lösungsansatz:

                warn "Der Parameter muss eine Zahl sein!" if /[1]+$/i;

                oder
                warn "Der Parameter muss eine Zahl sein!" unless /[2]+$/i;
                oder...
                Es gibt da viele Möglichkeiten es zu tun;-)

                Grüße
                  Klaus

                PS: irgendwie ist es komisch, am frühen Nachmittag postings zu lesen, die schon recht spät am Abend gemacht wurden


                1. ^0-9 ↩︎

                2. 0-9 ↩︎

                1. Hallo,

                  warn "Der Parameter muss eine Zahl sein!" unless /[1]+$/i;
                  oder...

                  warn "Der Parameter muss eine Zahl sein!" if /[^A-Z]/i;
                  geht auch
                  Gruss
                  Alain


                  1. 0-9 ↩︎

                  1. warn "Der Parameter muss eine Zahl sein!" if /[^A-Z]/i;
                    geht auch

                    Hast du das probiert?

                    Struppi.

                    1. hi,

                      warn "Der Parameter muss eine Zahl sein!" if /[^A-Z]/i;
                      geht auch

                      Hast du das probiert?

                      nö,warum sollte es vielleicht
                      warn "Der Parameter muss eine Zahl sein!" unless /[^A-Z]/i;
                      heissen?
                      Naja es könnte ja noch was anderes ausser buchstaben und zahlen geben z.B. all die sonderzeichen,von daher denke ich ist Klaus Mock's methode bestimmt geeigneter.
                      Gruss
                      Alain

                      1. Hast du das probiert?

                        nö,warum sollte es vielleicht
                        warn "Der Parameter muss eine Zahl sein!" unless /[^A-Z]/i;
                        heissen?
                        Naja es könnte ja noch was anderes ausser buchstaben und zahlen geben z.B. all die sonderzeichen,von daher denke ich ist Klaus Mock's methode bestimmt geeigneter.

                        ausprobieren:

                        $_ = '999';
                        print "$_ ist:\n";
                        print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Klaus Mock sagt: " . ( /[1]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                        $_ = 'A';
                        print "$_ ist:\n";
                        print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Klaus Mock sagt: " . ( /[2]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                        $_ = 'A999';
                        print "$_ ist:\n";
                        print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Klaus Mock sagt: " . ( /[3]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                        $_ = '9.99';
                        print "$_ ist:\n";
                        print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Klaus Mock sagt: " . ( /[4]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                        print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                        Struppi.


                        1. 0-9 ↩︎

                        2. 0-9 ↩︎

                        3. 0-9 ↩︎

                        4. 0-9 ↩︎

                        1. hi Struppi,

                          ausprobieren:

                          hab ich

                          $_ = '999';
                          print "$_ ist:\n";
                          print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                          print "Klaus Mock sagt: " . ( /[1]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                          print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                          stimmt.

                          $_ = 'A';
                          print "$_ ist:\n";
                          print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                          print "Klaus Mock sagt: " . ( /[2]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                          print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                          stimmt

                          $_ = 'A999';

                          wieso ist das in meiner version eine zahl?

                          print "$_ ist:\n";
                          print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";

                          bedeutet doch,alles ausser A-Z(ignoriere gross/klein schreibung)
                          ist diese frage stellung etwa verkehrt?

                          print "Klaus Mock sagt: " . ( /[3]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                          print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                          und "^\d" ist das etwas spezielles?

                          $_ = '9.99';
                          print "$_ ist:\n";
                          print "Alain sagt:      ". (/[^A-Z]/i ? 'eine' : 'keine' ). " Zahl\n";
                          print "Klaus Mock sagt: " . ( /[4]+$/i ? 'eine' : 'keine' ). " Zahl\n";

                          da wäre
                          print "Klaus Mock sagt: " . ( /[5]+$/i ? 'eine' : 'keine' ). " Zahl\n";
                          auch richtig bzw. wenn alle so geschrieben wären.

                          print "Struppi sagt:    ". ( /[^\d.]/? 'keine' : 'eine' ). " Zahl\n";

                          Hast ja wieder viel zeit gehabt gestern,jedenfalls was dieses beispiel angeht? ;-)
                          Grüsse
                          Alain


                          1. 0-9 ↩︎

                          2. 0-9 ↩︎

                          3. 0-9 ↩︎

                          4. 0-9 ↩︎

                          5. 0-9. ↩︎

                    2. Halli hallo,

                      warn "Der Parameter muss eine Zahl sein!" if /[^A-Z]/i;
                      geht auch

                      Hast du das probiert?

                      Nein, aber wie schaut das hier aus?

                      Nur mein kleines Testskript:

                      #!/usr/bin/perl

                      use strict;

                      my $arg="@ARGV";
                      my $tmp="$arg";
                      $tmp=~s/\d//g;

                      if($tmp) {
                         print "Falsche Zeichen: $tmp\n";
                         print "Der Parameter muss eine Ganzzahl zwischen 0 und 65535 sein.\n";
                         exit;
                      }

                      if($arg < 1 || $arg > 65535) {
                         print "Der Parameter muss eine Ganzzahl zwischen 0 und 65535 sein.\n";
                         exit;
                      }

                      Also mein genaues Ziel ist, das ein über einen frei wählbaren Port eine Socketverbindung geöffnet werden soll. Bevor dann unzählige Variablen aus Konfigurationsdateien lade, möchte ich natürlich zu Anfang prüfen, ob der Port auch tatsächlich eine Ganzzahl ist. Schreibfehler wie zum Beispiel der Buchstabe o statt einer Null oder eine Kommazahl sollen rechtzeitig identifiziert werden. Wäre das obige Beispiel ok als Lösung?

                      Mfg,
                      Jonny

                      1. hi,
                        ich versuchs mal.

                        Nur mein kleines Testskript:

                        #!/usr/bin/perl

                        use strict;

                        my $arg="@ARGV";
                        my $tmp="$arg";
                        $tmp=~s/\d//g;

                        existiert $arg auf jeden fall?
                        sonst müsste es eventuell
                        my $arg="@ARGV"||'standardportzahl';
                        oder zumindest
                        my $arg="@ARGV"||'';
                        heissen

                        if($tmp) {

                        #wenn zahl,print "Falsche Zeichen...?

                        print "Falsche Zeichen: $tmp\n";
                           print "Der Parameter muss eine Ganzzahl zwischen 0 und 65535 sein.\n";
                           exit;
                        }

                        ich denke die fragestellung oben ist falsch oder unnötig
                        besser wäre unless ($tmp =~ /[^\d]/) anstatt if ($tmp)
                        aber weiter oben hast Du ja mit $tmp=~s/\d//g; bereits dafür gesorgt
                        dass da nur noch zahlen drinn sind im $tmp ,desshalb unnötig,nochmal abzufragen.

                        if($arg < 1 || $arg > 65535) {

                        da wäre vielleicht if(($arg) && ($arg > 65535))
                        genügsam

                        print "Der Parameter muss eine Ganzzahl zwischen 0 und 65535 sein.\n";
                           exit;
                        }

                        Also mein genaues Ziel ist, das ein über einen frei wählbaren Port eine Socketverbindung geöffnet werden soll. Bevor dann unzählige Variablen aus Konfigurationsdateien lade, möchte ich natürlich zu Anfang prüfen, ob der Port auch tatsächlich eine Ganzzahl ist. Schreibfehler wie zum Beispiel der Buchstabe o statt einer Null oder eine Kommazahl sollen rechtzeitig identifiziert werden. Wäre das obige Beispiel ok als Lösung?

                        probieren geht manchmal über studieren
                        Gruss
                        Alain

                        1. hi nochma,

                          Nur mein kleines Testskript:

                          #!/usr/bin/perl

                          use strict;

                          my $arg="@ARGV";
                          my $tmp="$arg";
                          $tmp=~s/\d//g;

                          wenn Du damit nur zahlen rausfiltern möchtest,dann ist mein bzw. Dein beispiel oben natürlich falsch.
                          Richtig wäre
                          $tmp =~ s/[^0-9]//g;
                          oder vermutlich auch
                          $tmp =~ s/[^\d]//g;
                          Gruss
                          Alain

                2. warn "Der Parameter muss eine Zahl sein!" if /[1]+$/i;
                  oder
                  warn "Der Parameter muss eine Zahl sein!" unless /[2]+$/i;

                  schon irgendwie komisch! /[3]+$/i heißt das nicht, wenn der Parameter eine Zahl ist, gebe warn aus? oder verstehe ich das falsch?

                  Gruß
                  Jonny


                  1. ^0-9 ↩︎

                  2. 0-9 ↩︎

                  3. ^0-9 ↩︎

            2. Soll er beides probieren. Eines davon sollte das gewünschte Ergebnis liefern. Auf jeden Fall ist

              warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;
              nicht so recht nachvollziehbar und ganz gewiß zu umständlich.

              ich würde es einfach so machen:

              if ($var ne int($var))
               {
                print "Das ist keine Zahl!\n";
               }

              Gruß
              Reiner

              1. Hallo Reiner,

                ich würde es einfach so machen:

                if ($var ne int($var))
                {
                  print "Das ist keine Zahl!\n";
                }

                schaut gut aus, teste ich...

                Gruß,
                Jonny

                1. if ($var ne int($var))
                  {
                    print "Das ist keine Zahl!\n";
                  }

                  schaut gut aus, teste ich...

                  Aber nur bei ganzen Zahlen.

                  Am flexibelsten dürfte das sein:
                  warn "Der Parameter muss eine Zahl sein!" if /[^\d.]/;

                  Struppi.

                  1. Hallo,

                    Aber nur bei ganzen Zahlen.

                    Am flexibelsten dürfte das sein:
                    warn "Der Parameter muss eine Zahl sein!" if /[^\d.]/;

                    und wie ist das:

                    /[^\d.\d$]/;

                    ?

                    Mfg,
                    Jonny

        2. Hallo Christoph,

          warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;

          Viel zu umständlich und übrigens sogar falsch. Parameter erhältst du doch mit
            $ENV{'QUERY_STRING'}
          oder?

          Nein, es handelt sich hierbei nicht um CGI. Die Parameter lese ich über @ARGV ein.

          Gruß,
          Jonny

      2. Hallo!

        Oh das ist viel. Mein Ziel ist, dass ein Perlskript mit Parameter gestartet werden soll. Der Parameter muss zwingend eine Zahl sein, wenn aber versehentlich ein Buchstabe eingetippt wird, soll eine Fehlmeldung ausgegeben werden. Könnte ich das auch so prüfen:

        warn "Der Parameter muss eine Zahl sein!" if /[abcdefghijklmnopqrstuvwxyz]/i;

        Am einfachsten so:

        if ($zahl =~ m/\D+/){warn "Das ist keine Zahl";}

        Damit werden nur beliebig lange (fast) Ganzzahlen akzeptiert.
        Mit Dezimalzahlen wird es komplizierter.

        Grüße
        saltun

        1. Hallo Saltun,

          if ($zahl =~ m/\D+/){warn "Das ist keine Zahl";}

          ja, das ist genial! Habe mir mal die Metazeichen im Perlbuch angeschaut... da hätte ich auch selber drauf kommen können!

          Dennoch... danke dir! :-)

          Mfg,
          Jonny

  2. Hallo,

    weiß jemand wie man eine Varible prüfen kann, ob sie einen String oder eine Zahl enthält?

    Das findest Du in der entsprechenden PerlFAQ:
    http://www.perldoc.com/perl5.8.4/pod/perlfaq4.html#How-do-I-determine-whether-a-scalar-is-a-number-whole-integer-float-

    Grüße
      Klaus