opi: return-Wert von Subfunktionen

Hallo und guten Morgen zusammen,

folgendes Problem liegt mir auf dem Herzen:

sub func {
   my %daten;
   if(open(FILE,"</datei")) {
      ... Verarbeitung ...
      return(%daten);
   }
   else { return; }
}

my %conf=func();

if(%conf) { ... }
else { ... }

Ich möchte den Hash %conf mit Daten füllen. Was mache ich aber nun, wenn die Funktion einen Fehler zurückliefern soll, weil zum Beispiel eine Datei nicht geöffnet werden konnte?

In dem Beispiel gebe ich dann ganz einfach in der else-Anweisung ein return ohne Wert zurück. Wenn ich dann %conf in einer If-Anweisung abfrage, funktioniert es auch, aber ist das so richtig? Gibt es einen besseren Lösungsansatz?

Wäre super, wenn mir da jemand helfen könnte

Greez,
opi

--
Für Syntaxfehler bitte ich um Entschuldigung!
  1. Hej,

    Was mache ich aber nun, wenn die Funktion einen Fehler zurückliefern soll, weil zum Beispiel eine Datei nicht geöffnet werden konnte?

    Wenn das Programm auf die zu öffnende Datei unweigerlich angwiesen ist sterben !

    Beste Grüße
    Biesterfeld

    --
    Was ist der Lieblingsfilm eines jeden Mathematikers?
    Das schweigende Lemma.
    1. Hej,

      Was mache ich aber nun, wenn die Funktion einen Fehler zurückliefern soll, weil zum Beispiel eine Datei nicht geöffnet werden konnte?
      Wenn das Programm auf die zu öffnende Datei unweigerlich angwiesen ist sterben !

      Stirb besser!

      Nacht'
      Biesterfeld

      --
      Man braucht einen Quantenmechaniker, um eine Glühbirne wahrscheinlich zu wechseln.
      1. Hi,

        Wenn das Programm auf die zu öffnende Datei unweigerlich angwiesen ist sterben !
        Stirb besser!

        Da könnt' ich ja jetzt noch einen draufsetzen, wenn's nur nicht so geschmacklos wäre ;-)

        Aber mal ernsthaft: bei Fehlern beim Einlesen einer _Konfigurations_datei sollte nicht einfach aufgegeben werden. Besser ist es mit oder auch nach einer kurzen Meldung a la "Konnte Configdatei nicht lesen: da hatte jemand eine Sauklaue!" o.ä. die voreingestellten Defaultwerte zu benutzen und wirklich erst dann zu versterben, wenn es keine Defaultwerte geben _kann_.
        Der Reflex "or die $reason" bei Perlprogrammierern (und natürlich auch vielen anderen, da heißt es nur anders) ist zwar meistens nützlich, sollte aber hin und wieder durchaus mal hinterfragt werden.

        so short

        Christoph Zurnieden

        1. Hallo,

          Aber mal ernsthaft: bei Fehlern beim Einlesen einer _Konfigurations_datei sollte nicht einfach aufgegeben werden. Besser ist es mit oder auch nach einer kurzen Meldung a la "Konnte Configdatei nicht lesen: da hatte jemand eine Sauklaue!"

          Sehr genau! Denn nicht umsonst bette ich die open-Anweisung in einer If-Bediengung ein! Es kommt halt nicht besonders gut beim Browser an, wenn sich das Proggi einfach so verabschiedet, weil jemand gepupst - sorry - hat :-)

          Greez,
          opi

          --
          Für Syntaxfehler bitte ich um Entschuldigung!
          1. Hi,

            Sehr genau! Denn nicht umsonst

            Ja, umsonst ist sowas nie, aber mitunter kann's durchaus vergeblich sein.

            SCNR ;-)

            so short

            Christoph Zurnieden

    2. Hallo,

      Hej,

      Was mache ich aber nun, wenn die Funktion einen Fehler zurückliefern soll, weil zum Beispiel eine Datei nicht geöffnet werden konnte?
      Wenn das Programm auf die zu öffnende Datei unweigerlich angwiesen ist sterben !

      Das darf nicht passieren! Es wird im Browser die Meldung generiert, dass die Datei nicht geöffnet werden konnte. Deshalb muss ich den Returnstatus der Subfunktion auswerten können.

      Greez,
      opi

      --
      Für Syntaxfehler bitte ich um Entschuldigung!
  2. sub func {
       my %daten;
       if(open(FILE,"</datei")) {

    Das du das öffnen von Dateien immer prüfen solltest hat Biesterfeld ja schon versucht auszuführen.

    ... Verarbeitung ...
          return(%daten);

    Wozu die Klammer?

    }
       else { return; }

    my %conf=func();

    if(%conf) { ... }
    else { ... }

    Ich möchte den Hash %conf mit Daten füllen. Was mache ich aber nun, wenn die Funktion einen Fehler zurückliefern soll, weil zum Beispiel eine Datei nicht geöffnet werden konnte?

    In dem Beispiel gebe ich dann ganz einfach in der else-Anweisung ein return ohne Wert zurück. Wenn ich dann %conf in einer If-Anweisung abfrage, funktioniert es auch, aber ist das so richtig? Gibt es einen besseren Lösungsansatz?

    Nein, das ist eine gute Möglichkeit.

    Struppi.

    1. sub func {
         my %daten;
         if(open(FILE,"</datei")) {

      Das du das öffnen von Dateien immer prüfen solltest hat Biesterfeld ja schon versucht auszuführen.

      Was du natürlich tust, also war der Kommentar von mir überflüssig.

      Struppi.

    2. Hallo Struppi,

      ... Verarbeitung ...
            return(%daten);

      Wozu die Klammer?

      Gewohnheit. :)

      Nein, das ist eine gute Möglichkeit.

      Ich dachte an eine Lösung wie zum Beispiel:

      if(%conf=func()) { ... }
      else { ... }

      Wie kann ich die Zuweisung und das Ausführen der Subfunktion direkt in eine If-Anweisung unterbringen?

      Greez,
      opi

      --
      Für Syntaxfehler bitte ich um Entschuldigung!
      1. return(%daten);

        Wozu die Klammer?

        Gewohnheit. :)

        woher, ich kenne keine Sprache wo return eine Funktion ist.

        Ich dachte an eine Lösung wie zum Beispiel:

        if(%conf=func()) { ... }
        else { ... }

        Wie kann ich die Zuweisung und das Ausführen der Subfunktion direkt in eine If-Anweisung unterbringen?

        so wie du es da machst müßte es eigentlich gehen.

        Struppi.

        1. Hallo,

          return(%daten);

          Wozu die Klammer?

          Gewohnheit. :)

          woher, ich kenne keine Sprache wo return eine Funktion ist.

          meistens schauen meine returns so aus:

          return($a,$b,$c);

          Daher die Gewohnheit der Klammern.

          Greez,
          opi

          --
          Für Syntaxfehler bitte ich um Entschuldigung!
  3. Tag opi.

    sub func {
       my %daten;
       if(open(FILE,"</datei")) {
          ... Verarbeitung ...
          return(%daten);
       }
       else { return; }
    }

    In diesem Falle gibt return 'undef' zurück, da es sich nicht um einen skalaren Kontext, sondern einen Listenkontext handelt. Insofern ist deine Variante so nicht zu beanstanden. Allerdings könntest du es etwas eleganter lösen, indem du ausschließlich bei Fehlern einen entsprechenden Schlüssel definierst:

    sub foo {  
      my %hash_to_return;  
      if(open(FILE, "</datei")) {  
        # tu was mit den Daten  
      }  
      else {  
        $hash_to_return{'error'} = "Irgendeine Fehlermeldung";  
      }  
      return %hash_to_return;  
    }
    

    Und der Aufruf:

    my %conf = foo();  
    if(exists $conf{'error'}) {  
      print "Fehler: $conf{'error'}";  
      exit;  
    }
    

    Aber das ist wie so oft Geschmackssache :-)

    Siechfred

    --
    «Ich liebe euch doch alle!»
    1. Hallo,

      sub foo {
        my %hash_to_return;
        if(open(FILE, "</datei")) {
          # tu was mit den Daten
        }
        else {
          $hash_to_return{'error'} = "Irgendeine Fehlermeldung";
        }
        return %hash_to_return;
      }

      Und der Aufruf:

      my %conf = foo();
      if(exists $conf{'error'}) {
        print "Fehler: $conf{'error'}";
        exit;
      }

      Aber das ist wie so oft Geschmackssache :-)

      Ich bin immer wieder überrascht, wieviel Hilfe man hier bekommt! Dankeschön! Diese Lösung ist echt genial! Warum bin ich da selber nicht drauf gekommen? :-)

      Dankeschön!

      Greez,
      opi

      --
      Für Syntaxfehler bitte ich um Entschuldigung!