return-Wert von Subfunktionen
opi
- perl
0 Biesterfeld0 Biesterfeld0 opi
0 Struppi0 Siechfred0 opi
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
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
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 !
Nacht'
Biesterfeld
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
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
Hi,
Sehr genau! Denn nicht umsonst
Ja, umsonst ist sowas nie, aber mitunter kann's durchaus vergeblich sein.
SCNR ;-)
so short
Christoph Zurnieden
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
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.
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.
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
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.
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
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
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