Alain: ist "return" bei subs pflicht?

Tach allerseits,
ich wollte zu "return" wissen,ob man nach einem sub aufruf einen namen für/bei "return" benötigt
und ob return überhaubt pflicht ist oder gehts bei perl nach dem sub aufruf automatisch dort weiter,
von wo der sub aufgerufen wurde?
Gruss
Alain

  1. Tach,

    ich wollte zu "return" wissen,ob man nach einem sub aufruf einen namen für/bei "return" benötigt

    Nein

    und ob return überhaubt pflicht ist oder gehts bei perl nach dem sub aufruf automatisch dort weiter,

    Es geht automatisch weiter. Return ist optional, um die Sub vorzeitig zu verlassen oder um Rückgabewerte zu übermitteln.

    freundlichen Gruß
    Danny

    --
    Selfcode: fo:) br:& n4:& ie:% mo:) va:| de:] zu:) fl:| ss:) ls:& ls:& js:|
    Motto:    OpenSource - Das Wissen der Menschheit gehört der Welt!
  2. Hallo Alain.

    ich wollte zu "return" wissen,ob man nach einem sub aufruf einen namen für/bei "return" benötigt und ob return überhaubt pflicht ist oder gehts bei perl nach dem sub aufruf automatisch dort weiter, von wo der sub aufgerufen wurde?

    return musst du nur dann explizit angeben, wenn die Funktion etwas zurück geben soll. Also sowas:

    my $foo = bar('blah');

    sub bar {
      return uc($_[0]);
    }

    Natürlich kannst du return auch ohne Rückgabewert aufrufen, was dann sinnvoll ist, wenn du die Subroutine vorzeitig verlassen willst. Siehe

    http://www.perldoc.com/perl5.8.4/pod/perlsub.html#DESCRIPTION

    Freundschaft!
    Siechfred

    --
    Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
    1. Hallo Siechfred,

      return musst du nur dann explizit angeben, wenn die Funktion
      etwas zurück geben soll.

      Nein, auch ohne Return wird etwas zurueckgegeben: undef.

      Grüße,
       CK

      --
      Death is God's way of telling you not to be such a wise guy.
      http://wwwtech.de/
      1. Hallo CK,

        return musst du nur dann explizit angeben, wenn die Funktion
        etwas zurück geben soll.
        Nein, auch ohne Return wird etwas zurueckgegeben: undef.

        Ja, du hast Recht, ich korrigiere mich:
        return muss dann angegeben werden, wenn die Funktion etwas anderes als undef zurück geben soll.

        Freundschaft!
        Siechfred

        --
        Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
        1. Hallo Siechfred,

          return musst du nur dann explizit angeben, wenn die Funktion
          etwas zurück geben soll.
          Nein, auch ohne Return wird etwas zurueckgegeben: undef.

          Ja, du hast Recht, ich korrigiere mich:
          return muss dann angegeben werden, wenn die Funktion etwas anderes
          als undef zurück geben soll.

          So, und jetzt muss ich dich nochmal korrigieren (und mich gleich
          mit):

          sub TRUE { 1; };
          sub FALSE { 0; };
          sub something { "something"; };
          sub ary { qw(a b c d e); };

          print TRUE,"\n";
          print FALSE,"\n";
          print something,"\n";
          print join(', ',ary),"\n";

          Grüße,
           CK

          --
          Mit einem Windhauch kannst du das Feuer loeschen. Mit einem Windhauch kannst du das Feuer entfachen.
          http://wwwtech.de/
          1. Hallo CK.

            sub TRUE { 1; };
            sub FALSE { 0; };
            sub something { "something"; };
            sub ary { qw(a b c d e); };

            print TRUE,"\n";
            print FALSE,"\n";
            print something,"\n";
            print join(', ',ary),"\n";

            Jepp, ich hab's gerade noch mal überflogen:

            "The return value of a subroutine is the value of the last expression
             evaluated by that sub, or the empty list in the case of an empty sub."

            und weiter:
            "If you specify no return value, the subroutine returns an empty list
             in list context, the undefined value in scalar context, or nothing
             in void context."

            (http://www.perldoc.com/perl5.8.4/pod/perlsub.html#DESCRIPTION)

            Also Korrektur der Korrektur (und jetzt hoffentlich endlich korrekt):
            Die return-Anweisung muss dann angegeben werden, wenn etwas anderes als das Ergebnis des letzten Ausdrucks innerhalb der Subroutine zurückgegeben oder die Subroutine vorzeitig beendet werden soll.

            Einigkeit erzielt?

            Freundschaft!
            Siechfred

            --
            Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
            1. Hallo,

              Also Korrektur der Korrektur (und jetzt hoffentlich endlich korrekt):
              Die return-Anweisung muss dann angegeben werden, wenn etwas anderes als das Ergebnis des letzten Ausdrucks innerhalb der Subroutine zurückgegeben oder die Subroutine vorzeitig beendet werden soll.

              Einigkeit erzielt?

              also klingt etwas kompliziert das ganze auch das (nicht ganz saubere)beispiel von CK ;-)
              desshalb mal ein beispiel von mir:

              if (formulareingaben = korrekt)
              {
              prüfeliste();
              }
              else
              {
              nichtgefunden();
              }
              sub prüfeliste {
              if (eintraginliste=gefunden)
              {
              print "gefunden\n"
              return=0;
              }
              else
              {
              return=1;#oder könnte man hier direkt den sub nichtgefunden() aufrufen?
              }
              }

              sub nichtgefunden {
              print "nicht gefunden\n"
              exit;
              }
              Verstehe ich das richtig das return=1 eigentlich (fast)dasselbe ist wie exit?
              ------------------------
              Gruss vom
              Alain
              P.S.Vielleicht stell ich mich zu dumm?...dafür sorry ;-)

              1. Hallo Alain.

                if (formulareingaben = korrekt)
                {
                prüfeliste();
                }
                else
                {
                nichtgefunden();
                }

                Hm, wenn du schon einen Wert zurückgibst, solltest du ihn auch weiterbenutzen, ansonsten reicht ein return, um die Sub einfach nur zu verlassen.

                sub prüfeliste {
                if (eintraginliste=gefunden)
                {
                print "gefunden\n"
                return=0;
                }

                Muss heißen return 0;, es sei denn, return soll eine Variable sein.

                else
                {
                return=1; # oder könnte man hier direkt den sub nichtgefunden() aufrufen?
                }

                Ja, ich denke schon, fände ich aber vom Stil her nicht gut, denn IIRC kehrt die sub nichtgefunden in die sub prüfeliste zurück.

                Verstehe ich das richtig das return=1 eigentlich (fast)dasselbe ist wie exit?

                Nein, return 1 gibt den Wert 1 zurück und das Script läuft weiter, während exit das Script sofort beendet.

                Freundschaft!
                Siechfred

                --
                Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
                1. Hallo,

                  Nein, return 1 gibt den Wert 1 zurück und das Script läuft weiter, während exit das Script sofort beendet.

                  alles klar,aber eine frage hätte ich noch,was ich nicht ganz verstehe ist,warum
                  werden z.B. in einer sub die returns im sub selbst zurück gegeben,wie z.B. in perldoc als beispiel beschrieben
                  sub max {
                  my $max = shift(@_);
                  foreach $foo (@_) {
                  $max = $foo if $max < $foo;
                  }
                  return $max;
                  }

                  ich verstehe die bedeutung oder zweck nicht ganz.Was bedeutet return $max?
                  Und in diesem sub fall ist $max zweimal definiert,auf welchen $max bezieht sich return $max?
                  Ist manchmal schon nicht ganz leicht den zusammenhang zu verstehen,vor allem wenn man nicht ganz transparente beispiele vor sich hat ;-)
                  Grüsse vom
                  Alain

                  1. Hallo Alain.

                    sub max {
                      my $max = shift(@_);
                      foreach $foo (@_) {
                        $max = $foo if $max < $foo;
                      }
                      return $max;
                    }

                    Ganz einfach, zuerst wird die Variable $max deklariert und ihr der erste der Sub übergebene Parameter zugewiesen. Dann werden alle übergebenen Parameter durchlaufen und mit $max verglichen. Trifft die Bedingung innerhalb der foreach-Schleife zu, wird $max statt des alten der neue Wert zugewiesen. Der Vergleich läuft dann mit dem neuen Wert von $max weiter.

                    Was bedeutet return $max?

                    "Gib den Wert von $max nach vollständigem Durchlauf der Sub max() zurück."

                    Und in diesem sub fall ist $max zweimal definiert,auf welchen $max bezieht sich return $max?

                    Nein, nicht zweimal definiert, zuerst definiert, dann wird ihr unter einer bestimmten Bedingung ein neuer Wert zugewiesen. Zurückgegeben wird $max mit dem Wert, den es am Ende der Sub haben wird. Das kann, je nach übergebenen Parametern, auch der ursprünglich mit "shift @_" definierte Wert sein.

                    Freundschaft!
                    Siechfred

                    --
                    Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
                    1. Hallo,

                      sub max {
                        my $max = shift(@_);
                        foreach $foo (@_) {
                          $max = $foo if $max < $foo;
                        }
                        return $max;
                      }

                      Ganz einfach, zuerst wird die Variable $max deklariert und ihr der erste der Sub übergebene Parameter zugewiesen. Dann werden alle übergebenen Parameter durchlaufen und mit $max verglichen. Trifft die Bedingung innerhalb der foreach-Schleife zu, wird $max statt des alten der neue Wert zugewiesen. Der Vergleich läuft dann mit dem neuen Wert von $max weiter.

                      Was bedeutet return $max?

                      "Gib den Wert von $max nach vollständigem Durchlauf der Sub max() zurück."

                      das heisst in etwa return $max wäre dasselbe wie return 1; ?
                      also:
                      sub max {
                      my $max = shift(@_);
                      foreach $foo (@_) {
                      $max = $foo if $max < $foo;
                      return 0;
                      }
                      return 1;
                      }
                      .............?

                      Grüsse vom
                      Alain

                      1. Hallo Alain.

                        "Gib den Wert von $max nach vollständigem Durchlauf der Sub max() zurück."
                        das heisst in etwa return $max wäre dasselbe wie return 1; ?

                        Kommt auf den Sinn der Operation an. Wenn du 0 und 1 im booleschen Kontext siehst, könnte es so sein. Das soll heißen, wenn das Ergebnis der sub max() wahr oder falsch sein soll, wäre es das Selbe, wenn das Ergebnis jedoch ein Wert sein soll, dann nicht.

                        sub max {
                        my $max = shift(@_);
                        foreach $foo (@_) {
                        $max = $foo if $max < $foo;
                        return 0;

                        An dieser Stelle verlässt du die Sub bereits beim ersten Durchlauf der foreach-Schleife, die Sub dürfte also nie 1 zurückgeben. Du meinst es aber sicher eher so:

                        if($max<$foo) {
                          $max = $foo;
                          return 0;
                        }

                        In diesem Fall kommt es wie gesagt auf das von dir erwartete Ergebnis an.

                        Freundschaft!
                        Siechfred

                        --
                        Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
                        1. Hallo Siechfred hallo Struppi,
                          Erstmal dank für eure Geduld ;-)

                          Kommt auf den Sinn der Operation an. Wenn du 0 und 1 im booleschen Kontext siehst, könnte es so sein. Das soll heißen, wenn das Ergebnis der sub max() wahr oder falsch sein soll, wäre es das Selbe, wenn das Ergebnis jedoch ein Wert sein soll, dann nicht.

                          ich habe einfach ein problem damit,dass man mit return auf eine variable-namen ziehlt anstatt 1 od. 0 also richtig oder falsch.
                          Aber langsam komm ich schon drauf.

                          sub max {
                          my $max = shift(@_);
                          foreach $foo (@_) {
                          $max = $foo if $max < $foo;
                          return 0;

                          An dieser Stelle verlässt du die Sub bereits beim ersten Durchlauf der foreach-Schleife, die Sub dürfte also nie 1 zurückgeben. Du meinst es aber sicher eher so:

                          if($max<$foo) {
                            $max = $foo;
                            return 0;
                          }

                          In diesem Fall kommt es wie gesagt auf das von dir erwartete Ergebnis an.

                          ja,das mit return 1 oder 0 hab ich 100% kapiert.
                          Man könnte eine abfrage return 1 od. 0 z.B. so stellen
                          unless (max())   #wenn return 0;
                          {
                          blabla
                          }
                          return $var heisst also dass der erste wert,wo $var definiert wurde in der sub
                          mit return $var; zurückgegeben wird,jenachdem ob if($var = richtig) richtig oder falsch war...
                          Grüsse vom
                          Alain

                          1. ja,das mit return 1 oder 0 hab ich 100% kapiert.
                            Man könnte eine abfrage return 1 od. 0 z.B. so stellen
                            unless (max())   #wenn return 0;
                            {
                            blabla
                            }
                            return $var heisst also dass der erste wert,wo $var definiert wurde in der sub
                            mit return $var; zurückgegeben wird,jenachdem ob if($var = richtig) richtig oder falsch war...

                            Nein, return $var heißt ganz einfach nur, dass der Wert von $var von der Funktion zurück gegeben wird.

                            Du kannst eine Funktion auch dazu verwenden etwas anderes als 1 oder 0 zurückzu geben.

                            sub test
                            {
                            my $var = 'Das ist ein Test';
                            }
                            var $x = test();
                            print $x;

                            Struppi.

                            1. hi Struppi,

                              Nein, return $var heißt ganz einfach nur, dass der Wert von $var von der Funktion zurück gegeben wird.

                              Du kannst eine Funktion auch dazu verwenden etwas anderes als 1 oder 0 zurückzu geben.

                              sub test
                              {
                              my $var = 'Das ist ein Test';
                              }
                              var $x = test();
                              print $x;

                              ok,das klingt für mich demnach so,als würde man perl damit zufrieden stellen,
                              mit irgend einem return $var; um den sub zu beenden,was so gut heisst,als wäre die sub nie ausgeführt worden.
                              P.S.return heisst doch übersetzt "geh zurück" oder?
                              Grüsse vom
                              Alain

                              1. sub test
                                {
                                my $var = 'Das ist ein Test';
                                }
                                var $x = test();
                                print $x;

                                ok,das klingt für mich demnach so,als würde man perl damit zufrieden stellen,
                                mit irgend einem return $var; um den sub zu beenden,was so gut heisst,als wäre die sub nie ausgeführt worden.

                                Was?

                                return heißt zurück und je nachdem, was du hinter return schreibst wird dieser Wert von der Funktion zurüchgegeben. Du kannst auch gar nichts angeben, dann ist der Rückgabewert undef. aber ob und was eine Funktion zurück gibt spielt keine Rolle, die Funktion wird trotzdem immer ausgeführt, sie wird nur an der Stelle wo das return steht beendet oder ohne return vor der schleissenden Klammer.

                                Du kannst return entweder dazu verwenden eine Funktion vorzeitig zu verlassen oder der Funktion explizit einen Rückgabewert zu geben (Standard Rückgabewert ist das Ergebniss der letzten Operation in der Funktion)

                                Struppi.

                                1. hi,

                                  return heißt zurück und je nachdem, was du hinter return schreibst wird dieser Wert von der Funktion zurüchgegeben. Du kannst auch gar nichts angeben, dann ist der Rückgabewert undef. aber ob und was eine Funktion zurück gibt spielt keine Rolle, die Funktion wird trotzdem immer ausgeführt, sie wird nur an der Stelle wo das return steht beendet oder ohne return vor der schleissenden Klammer.

                                  Du kannst return entweder dazu verwenden eine Funktion vorzeitig zu verlassen oder der Funktion explizit einen Rückgabewert zu geben (Standard Rückgabewert ist das Ergebniss der letzten Operation in der Funktion)

                                  ok,ich hab nun verstanden,was Du meinst.Wichtig ist für mich also return...
                                  Danke.
                                  Grüsse
                                  Alain

                      2. Was bedeutet return $max?

                        "Gib den Wert von $max nach vollständigem Durchlauf der Sub max() zurück."

                        das heisst in etwa return $max wäre dasselbe wie return 1; ?

                        Nein, wie kommst du darauf?

                        return $max gibt den Wert von $max zurück return 1 gibt den Wert eins zurück.

                        also:
                        sub max {
                        my $max = shift(@_);
                        foreach $foo (@_) {
                        $max = $foo if $max < $foo;
                        return 0;
                        }
                        return 1;
                        }

                        Das ist etwas komplett anderes.

                        Struppi.

      2. return musst du nur dann explizit angeben, wenn die Funktion
        etwas zurück geben soll.

        Nein, auch ohne Return wird etwas zurueckgegeben: undef.

        Nein, ohne return wird das Ergebnis der letzten Operation zurückgegeben (ich vermute mal $_).

        Struppi.