DeWitt: return: "leere" Werte als Rückgabe erlauben

Hallo Self-Forum,

Ich habe folgendes Problem bei einem Perl-Programm:

Eine Subroutine soll aus einer Datei einen Wert auslesen und diesen ans Hauptprogramm zurückgeben. Wenn innerhalb der Subroutine ein Fehler passiert (z.B. Datei kann nicht geöffnet werden), wird die Fehlermeldung in $@ gespeichert und die Subroutine mit 'return 0'; abgebrochen, ansonsten wird am Ende der Subroutine mit 'return $value;' der ausgelesene Wert zurückgegeben
Das Hauptprogramm ruft die Routine wie folgt auf:

  
my $value = $accounts->getValue($id','name') || die $@;  

Das ganze funktioniert auch wunderbar, nur mit einem Haken: Wenn nun der ausgelesene Wert gerade 0 oder auch '' ist, erhalte ich natürlich einen Fehler ("Died at ..."). Kann ich das irgendwie umgehen, d.h. eine Null-Rückgabe entsprechend maskieren?

  1. my $value = $accounts->getValue($id','name') || die $@;

    
    >   
    > Das ganze funktioniert auch wunderbar, nur mit einem Haken: Wenn nun der ausgelesene Wert gerade 0 oder auch '' ist, erhalte ich natürlich einen Fehler ("Died at ..."). Kann ich das irgendwie umgehen, d.h. eine Null-Rückgabe entsprechend maskieren?  
      
    Nein, du kannst prüfen ob der Rückgabewert definiert ist, dann geht aber nicht mehr diese Kurzschreibweise.  
      
    ~~~perl
      
    my $value = $accounts->getValue($id','name') ;  
    die $@ unless defined $value;  
    
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hell-O!

      Nein, du kannst prüfen ob der Rückgabewert definiert ist, dann geht aber nicht mehr diese Kurzschreibweise.

      Ähm, habe ich was überlesen? Im Misserfolgsfall wird doch (auch) 0 zurückgegeben, somit ist $value in jedem Fall definiert. Um deinen Ansatz zu komplettieren, müsste die Subroutine bei Misserfolg 'undef' zurückgeben.

      Siechfred

      --
      Hier könnte Ihre Werbung stehen.
      Das Steuer-Blog | Siechfreds Tagebuch
      1. Ähm, habe ich was überlesen? Im Misserfolgsfall wird doch (auch) 0 zurückgegeben, somit ist $value in jedem Fall definiert. Um deinen Ansatz zu komplettieren, müsste die Subroutine bei Misserfolg 'undef' zurückgeben.

        Stimmt, wobei dann einfach nur  return; reicht.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Danke, genau so etwas habe ich gesucht!

  2. Hell-O!

    Eine Subroutine soll aus einer Datei einen Wert auslesen und diesen ans Hauptprogramm zurückgeben. Wenn innerhalb der Subroutine ein Fehler passiert (z.B. Datei kann nicht geöffnet werden), wird die Fehlermeldung in $@ gespeichert und die Subroutine mit 'return 0'; abgebrochen, ansonsten wird am Ende der Subroutine mit 'return $value;' der ausgelesene Wert zurückgegeben

    Eleganter wäre es, wenn die Subroutine bei einem Fehler 'undef' zurückgibt. Prüfen kannst du das dann ganz einfach:

    die $@ unless defined (my $value = $accounts->getValue($id,'name'));

    Ist $value nicht definiert, gibt's eine Fehlermeldung, anderenfalls steht dir $value im weiteren mit dem Rückgabewert zur Verfügung.

    Siechfred

    --
    Hier könnte Ihre Werbung stehen.
    Das Steuer-Blog | Siechfreds Tagebuch