Chrisi: Subroutine return true / false?

Hi zusammen,

ich habe eine Frage zu den Rückgabewerten einer Perl Subroutine.

Ich möchte gern einen Erfolg oder nicht Erfolg zurückgeben und diesen auszuwerten.

Beispiel:

sub isAlive {  
    if (1 == 1) {  
        return 1;  
    }  
}
if(isAlive()){  
    # Wahr  
}else{  
    # Nicht Wahr  
}

Mein Problem ist das in Strict kein ture oder false erlaubt ist. Ich möchte nur ungern den ganzen Code mit return 0 / return 1 vollstopfen und bei allen if Abragen die Rückgabe auf 0 / 1 pruefen.

Kann mir jemand sagen wie man es sauber und richtig anstellt?

Danke und Grüße
Chrisi

  1. 你好 Chrisi,

    Mein Problem ist das in Strict kein ture oder false erlaubt ist. Ich möchte nur ungern den ganzen Code mit return 0 / return 1 vollstopfen und bei allen if Abragen die Rückgabe auf 0 / 1 pruefen.

    Kann mir jemand sagen wie man es sauber und richtig anstellt?

    In Perl ist undef, '', '0', 0, 0.0 und () unwahr, der Rest ist wahr. Das heißt: wenn du auf wahr prüfen willst, gib einen Wert ungleich der oben genannten zurück, ansonsten undef. Z. B. so:

      
    sub check_me() {  
      return;  
    }  
      
    sub check_me_true() {  
      return 1;  
    }  
      
    print "Cannot happen!\n" if check_me();  
    print "Must happen!\n" if check_me_true();  
    
    

    再见,
     克里斯蒂安

    --
    http://wwwtech.de/
    IRC-Clients und Irssi-Scripting | Flyspray
    89,7% aller Statistiken sind frei erfunden!
    1. Hi Christian,

      In Perl ist undef, '', '0', 0, 0.0 und () unwahr, der Rest ist wahr.

        
      unless ( 0E0) {print "ich auch ;)"}  
      
      

      Grüße
       rolf

      1. 你好 LanX!,

        In Perl ist undef, '', '0', 0, 0.0 und () unwahr, der Rest ist wahr.

        unless ( 0E0) {print "ich auch ;)"}

          
        Hihi. Ja. Danke.  
          
        再见,  
         克里斯蒂安  
        
        -- 
        <http://wwwtech.de/>  
        [IRC-Clients und Irssi-Scripting](http://ck.kennt-wayne.de/irc-clients-und-irssi-scripting) | [Flyspray](http://ck.kennt-wayne.de/flyspray)  
        Kommt ein Vektor zur Drogenberatung: "Hilfe, ich bin linear abhaengig!"  
        
        
  2. hi,

    Mein Problem ist das in Strict kein ture oder false erlaubt ist. Ich möchte nur ungern den ganzen Code mit return 0 / return 1 vollstopfen und bei allen if Abragen die Rückgabe auf 0 / 1 pruefen.

    Vielleicht hilft Dir das pragma constant:

    use constant TRUE => 1;
    use constant FALSE => 0;

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Moin Moin!

      Vielleicht hilft Dir das pragma constant:

      use constant TRUE => 1;
      use constant FALSE => 0;

      Schlechte Idee.

      sub oops { return FALSE; }
      bzw.
      sub oops { return 0; }

      liefern im List-Kontext *true* zurück, weil die Liste eben ein Element enthält. Das Element selbst ist zwar false, aber das spielt keine Rolle. D.h. auch

      sub oops2 { return undef; }

      geht im List-Kontext schief.

      Der einzig saubere Weg, false zurückzuliefern, ist ein return ohne Wert:

      sub always_false { return; }

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. Hi Alexander

        mir fällt gerade kein Beispiel ein wie man eine boolesche Bedingung im listcontext machen könnte...?

        Grüße
         rolf

        1. 你好 LanX!,

          mir fällt gerade kein Beispiel ein wie man eine boolesche Bedingung im listcontext machen könnte...?

          Naja, ganz einfach:

          sub this_is_true_in_list() {  
            return undef;  
          }  
            
          my @list = this_is_true_in_list();  
          my $scalar = this_is_true_in_list();  
          print "true!\n" if @list;  
          print "false!\n" unless $scalar;
          

          Die Verwendung von return; würde ich immer empfehlen.

          再见,
           克里斯蒂安

          --
          http://wwwtech.de/
          IRC-Clients und Irssi-Scripting | Flyspray
          Der Mund ist das Portal zum Unglück.
          1. Hi Christian,

            ja aber ...wrgh ... wenn man versehentlich in den Listkontext stolpert soll es mir recht sein, obwohl ich mir da noch kein Beispiel vorstellen kann.

            Aber es ist doch nicht wirklich clever einen boolesche Entscheidung einem Array zuzuordnen, wer so coded sollte die kompletten Perlsourcen 10 mal abschreiben müssen ... und das mit nem Blackberry!

            Cheers Rolf

            PS: schön das du deine Chinaflagge weiter hoch hälst. Und haste es mittlerweile auch mal im Lande ausprobieren können???

            1. OK

              hab mal im PBP geblättert, dort empfiehlt Conway ein reines Return für Fehlerrückgaben zu nehmen, insbesondere wenn sonst eine Liste erwartet wird.

                
              if( my @liste = gib_liste("blabla") {  
                ... tue etwas mit liste  
              }  
              
              

              das ist aber eigentlich nicht was der OP möchte, seine Routine soll immer einen scalar zurückgeben!

              Cheers
               rolf

              1. 你好 LanX!,

                das ist aber eigentlich nicht was der OP möchte, seine Routine soll immer einen scalar zurückgeben!

                Das liegt nicht in der Kontrolle desjenigen, der die Routine schreibt. Den Listen-Kontext kann man immer fordern, etwa mit my ($val) = subroutine();. Gibt die Routine immer einen Skalar zurück, wird der eben in eine Liste verwandelt. Da kann man nicht viel dran ändern. Deshalb ja auch return; und nicht return undef;.

                再见,
                 克里斯蒂安

                --
                http://wwwtech.de/
                IRC-Clients und Irssi-Scripting | Flyspray
                Ihr wisst nicht, wie man den Menschen dient. Wie sollt ihr wissen, wie man den Goettern dienen soll?
                1. Hi

                  Gibt die Routine immer einen Skalar zurück, wird der eben in eine Liste verwandelt. Da kann man nicht viel dran ändern. Deshalb ja auch return; und nicht return undef;.

                  der Vollständigkeit halber, es gibt noch wantarray!

                  Cheers
                   rolf

                  1. Moin Moin!

                    »» Gibt die Routine immer einen Skalar zurück, wird der eben in eine Liste verwandelt. Da kann man nicht viel dran ändern. Deshalb ja auch return; und nicht return undef;.

                    der Vollständigkeit halber, es gibt noch wantarray!

                    Du möchtest also folgendes vorschlagen?

                      
                    sub always_false  
                    {  
                      if (defined wantarray) {  
                        if (wantarray) {  
                          return (); # List context: leere Liste  
                        } else {  
                          return undef; # Scalar context: undef  
                        }  
                      } else {  
                        return; # void context: NIX -- oder genauer: es ist völlig egal, weil es dem caller am A... vorbeigeht.  
                      }  
                    }  
                    
                    

                    Spätestens wenn ich sowas ernsthaft in den Editor hacke, bekommt der Editor ein kill -9, und ich gehe SCHLEUNIGST ins Bett. Denn das ist ein sicheres Zeichen dafür, dass das Gehirn längst auf Standby läuft.

                    Aber sei's drum: Optimieren wir diesen Murks mal etwas. Zunächst liefert return; im List-Context eine leere Liste, die Klammern sind redundant:

                      
                    sub always_false  
                    {  
                      if (defined wantarray) {  
                        if (wantarray) {  
                          return; # List context: leere Liste  
                        } else {  
                          return undef; # Scalar context: undef  
                        }  
                      } else {  
                        return; # void context: NIX  
                      }  
                    }  
                    
                    

                    Schritt 2: return; liefert im Scalar-Context den undefinierten wert, undef ist redundant:

                      
                    sub always_false  
                    {  
                      if (defined wantarray) {  
                        if (wantarray) {  
                          return; # List context: leere Liste  
                        } else {  
                          return; # Scalar context: undef  
                        }  
                      } else {  
                        return; # void context: NIX  
                      }  
                    }  
                    
                    

                    Schritt 3: Das innere if-then-else enthält für then und else bis auf die Kommentare exakt den selben Code-Block. Einer der beiden Blöcke und die gesamte if-then-else-Konstruktion kann also entfallen, die Kommentare sind zu bereinigen:

                      
                    sub always_false  
                    {  
                      if (defined wantarray) {  
                        return; # List context: leere Liste, Scalar context: undef  
                      } else {  
                        return; # void context: NIX  
                      }  
                    }  
                    
                    

                    Schritt 4: Deja vu -- noch eine redundante if-then-else-Konstruktion. Weg damit:

                      
                    sub always_false  
                    {  
                      return; # List context: leere Liste, Scalar context: undef, void context: NIX  
                    }  
                    
                    

                    q.e.d.

                    Alexander

                    --
                    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                    1. Du möchtest also folgendes vorschlagen?
                      ...

                      nein!

                      1. Moin Moin!

                        nein!

                        sondern?

                        Alexander

                        --
                        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                        1. na so wie's dasteht:

                          C.K.> Das liegt nicht in der Kontrolle desjenigen, der die Routine schreibt... Da kann man nicht viel dran ändern.
                          LanX> Der Vollständigkeit halber, es gibt noch wantarray!

                          Zur Sache: ich hab nix gegen ein nacktes return für false zurückgegeben, du hast mir aber immer noch kein Beispiel gegeben worden, wie sich ein Listcontext *unbemerkt* in eine boolesche Bedingung einschleichen sollte, sodass man tatsächlich ungewollt sowas wie if ( Liste ) {} dastehen hätte.

            2. 你好 LanX,

              ja aber ...wrgh ... wenn man versehentlich in den Listkontext stolpert soll es mir recht sein, obwohl ich mir da noch kein Beispiel vorstellen kann.

              Nun, ich habe eine Routine, die entweder eine Liste zurückgibt oder undef im Fehlerfall. Und schon macht es bumm.

              Aber es ist doch nicht wirklich clever einen boolesche Entscheidung einem Array zuzuordnen, […]

              Es geht ja eher um so was wie Fehlerbehandlung oder so. Ich habe eine Routine, die im Erfolgsfall eine Liste von Werten zurück gibt und im Fehlerfall undef. Mit return undef; kann man da leicht stolpern, mit return; funktioniert es recht gut.

              wer so coded sollte die kompletten Perlsourcen 10 mal abschreiben müssen ... und das mit nem Blackberry!

              Hehe, auf einem Blackberry lässt sich noch vergleichsweise gut tippen. Schonmal eins von diesen unsäglichen O2-Terra-Dingern in der Hand gehabt? :)

              PS: schön das du deine Chinaflagge weiter hoch hälst. Und haste es mittlerweile auch mal im Lande ausprobieren können???

              Leider noch nicht :( Und es sieht auch nicht so aus, als könnte ich es in nächster Zeit, da die Nachwuchs-Planung langsam konkretere Pläne annimmt. Aber bevor jemand fragt, es gibt noch keinen Grund zur Gratulation ;)

              再见,
               克里斯蒂安

              --
              http://wwwtech.de/
              IRC-Clients und Irssi-Scripting | Flyspray
              Unsere Vorstellungen von der Ewigkeit sind genauso nuetlich wie die Mutmassungen eines Kuekens ueber die Aussenwelt bevor es die Eierschale aufbricht.