5 Stimmen

Im Perl, wie überprüfe ich einen undefinierten ODER leeren Parameter?

Ich habe etwas Code wie folgt:

if (not defined $id) {
    print "Geben Sie die ID-Nummer ein: ";
    chomp ($id = );
    exit 0 if ($id eq ""); # Wenn der String leer ist, beenden.
}
if (not defined $name) {
    print "Geben Sie den Namen ein: ";
    chomp ($name = );
    exit 0 if ($name eq ""); # Wenn der String leer ist, beenden.
}
if (not defined $class) {
    print "Geben Sie die Klasse ein: ";
    chomp ($class = );
    exit 0 if ($class eq ""); # Wenn der String leer ist, beenden.
}

Ich möchte in der Lage sein, potenziell nur einige von ihnen zu übergeben (z.B. Name und Klasse, aber nicht ID), indem ich Leerzeichen für die nicht übergebenen verwende, also dachte ich, dass das Folgende funktionieren würde:

if (not defined $id || $id eq "") {
    print "Geben Sie die ID-Nummer ein: ";
    chomp ($id = );
    exit 0 if ($id eq ""); # Wenn der String leer ist, beenden.
}

Aber es scheint nicht zu funktionieren, wenn ich z.B. das Folgende übergebe:

perl "meinperlroutin.pl" "" "Mickey Mouse" "Eintrag"

Das Befehlsfenster (ich führe dies auf Windows aus) erscheint kurz und verschwindet dann sofort.

Fehlt mir etwas Offensichtliches?

17voto

ysth Punkte 91645

Sie verwenden die niedrige Präzedenz not, wo Sie die hohe Präzedenz ! verwenden sollten.

Sie sagen also:

if ( not( defined $id || $id eq "" ) )

was so aussieht:

if ( ! defined $id && $id ne '' )

was immer falsch ist.

Also tun Sie

if ( ! defined $id || $id eq '' )

stattdessen.

Mit Perl 5.12 und später warnt length() nicht mehr, wenn undef übergeben wird, was unglaublich praktisch ist. Also können Sie einfach tun:

if ( ! length $id ) {

was ein kurzer Code ist, aber ineffizient sein könnte, wenn $id ein langer UTF-8 String ist, bei dem die Längenbestimmung schwierig ist. Da wäre ich eher geneigt zu tun:

if ( ( $id // '' ) eq '' ) {

Aber das ist nicht besonders lesbar, es sei denn, Sie sind mit diesem Idiom vertraut.

5voto

Dave Cross Punkte 65470

Sie haben gute Antworten erhalten, die genau erklären, was mit Ihrem Code falsch ist. Aber niemand hat sich zum Gesamtkonzept geäußert.

Die Verwendung von Positionsargumenten wie in diesem Fall ist (wie Sie sehen können) problematisch, wenn die Argumente optional werden. In dieser Situation ist es eine weitaus bessere Idee, benannte Argumente zu verwenden. Die Standard-Perl-Bibliothek wird mit zwei Modulen geliefert (Getopt::Std und Getopt::Long), die es leicht machen, flexible Gruppen von Befehlszeilenoptionen zu erstellen. Ich empfehle, dass Sie sich eine davon ansehen.

2voto

Axeman Punkte 29362

Dies deckt so ziemlich alles ab, wonach du suchst:

 if ( not length( $id )) { 
     ...
 }

Auch bekannt als:

 unless ( length $id ) { 
     ...
 }

0voto

tjwrona1992 Punkte 8091

Wenn Ihr Fenster sofort verschwindet, deutet das in der Regel auf einen Kompilierungsfehler hin. Sie sollten das Befehlsfenster öffnen und das Skript von der Befehlszeile ausführen:

  • Klicken Sie auf "Start"
  • Geben Sie "cmd" in die Suchleiste ein und drücken Sie Enter.

Führen Sie dann Ihr Skript von der Befehlszeile aus wie folgt:

perl voller_pfad_zum_skript\skript_name.pl

Wenn Sie dies tun, sollte das Befehlsfenster nicht sofort geschlossen werden. Stattdessen sollte es einige Rückmeldungen dazu geben, warum Ihr Skript nicht ausgeführt wird. Wenn Sie auch nach diesem Vorgang immer noch nicht herausfinden können, warum es fehlschlägt, sollten Sie auch Ihre Kompilierungsfehler posten, damit wir sie uns ansehen können.

Außerdem hat ysth recht. Sie sollten "!" anstelle von "not" verwenden.

Beispiel:

if ((!defined $id) || ($id eq '')) {
    print "Geben Sie die ID-Nummer ein: ";
    chomp ($id = );
    exit 0 if ($id eq ""); # Wenn der String leer ist, beenden Sie.
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X