mark: subroutine beenden mit exit(&subroutine);

hallo,

ich habe im archiv gelesen, dass es ein unschöner programmierstil sei, wenn subroutinen mit exit beendet werden.

wäre es dann so richtig??

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";

open(FH, ">a.txt") or exit(&test);
print FH "slf";
close(FH);

open(FH, "<b.txt") or exit(&test);
my $t = <FH>;
close(FH);

open(FH, ">c.txt") or exit(&test);
print FH $t;
close(FH);

print "OK";

sub test {
print "Sorry, leider ist ein Fehler aufgetreten";
}

ich wäre sehr dankbar für hilfreiche antworten.

  1. Hi,

    open(FH, ">a.txt") or exit(&test);

    Besser wäre an dieser Stelle imo:

    my $fn = "a.txt";
    open(FH, ">$fn") || exit(test($fn, $!));

    Die sub test könnte dann so aussehen:

    sub test {
      my $file = shift;
      my $error = shift;
      print "Beim Öffnen/Lesen der Datei $file ist folgender Fehler aufgetreten: $error.\n";
      return 1;
    }

    Besser geht's um die Uhrzeit nicht, deshalb ungetestet und sicher verbesserungswürdig :)

    Viele Grüße
    Torsten

    1. hi,

      aber sonst wäre das mit der exit-anweisung ok, oder?

      open(FH, ">$fn") || exit(test($fn, $!));

      macht des ein unterschied ob ich subroutinen mit &test oder mit test() aufrufe??

      1. Hi Mark,

        macht des ein unterschied ob ich subroutinen mit &test oder mit test() aufrufe??

        Soweit ich weiß, ist das "&" optional, allerdings die "()" am Ende nicht.

        Viele Grüße
        Torsten

        1. macht des ein unterschied ob ich subroutinen mit &test oder mit test() aufrufe??

          Soweit ich weiß, ist das "&" optional, allerdings die "()" am Ende nicht.

          aber in meinen bücher werden die subroutinen immer mit "&" und ohne "()" aufgerufen.

          1. Hi,

            aber in meinen bücher werden die subroutinen immer mit "&" und ohne "()" aufgerufen.

            Du kannst schreiben:

            subroutine();
            &subroutine;
            &subroutine();

            Wobei afaik meist die erstere empfohlen wird.

            Viele Grüße
            Torsten

            1. ups,

              ich habe gerade nachgeschaut und festgestellt, dass es stimmt.
              & = optional
              () sollte vorhanden sein

              danke für die sehr hilfreichen antworten.

              gruss mark

  2. hallo,

    ich habe im archiv gelesen, dass es ein unschöner programmierstil sei, wenn subroutinen mit exit beendet werden.

    Jein.
    Du beendest ja in deinem Falle nciht die subroutine, sondern möchtest das Programm beenden und dann ist exit die Wahl.

    open(FH, ">a.txt") or exit(&test);

    ?????
    exit ist ein Perl Funktion und der übergibst du den Rückgabewert der Funktion test?

    sinnvoller:

    open(FH, ">a.txt") or die "Kann a.txt nicht öffnen, weil: $!";

    oder eben

    open(FH, ">a.txt") or test("Kann a.txt nicht öffnen, weil: $!");

    sub test {

    print $_[0];
    exit;

    }

    exit sollte nur in ausnahmefällen verwendet werden, weil der Code dadurch schwerer wartbar wird. aber in so  einem  Falle, d.h. bei einem schweren Fehler, durchaus üblich.

    Struppi.

    1. open(FH, ">a.txt") or die "Kann a.txt nicht öffnen, weil: $!";

      oder eben

      open(FH, ">a.txt") or test("Kann a.txt nicht öffnen, weil: $!");

      sub test {

      print $_[0];
      exit;

      }

      hi, aber eine die "die"-anweisung brauch ich nicht, weil durch die subroutine mir eine email zugeschickt wird, damit ich über den fehler benachrichtigt werde.

      und dein zweiter vorschlag ist glaub auch nicht so gut, weil du rufst die subroutine auf und hast die "exit"-anweisung in der subroutine drin, und das sollte meines wissen nach nicht sein.