Da die Diskussion mal wieder sinnlos ausufert, hier eine Erklärung, was den Sinn dieses Konstruktes ausmacht, wie es zu verstehen ist und wie es benutzt wird:
my $x = 'FF';
my $d = '255';
print eval{
$x =~ /^[0-9a-fA-F]+$/ or die "Wrong format for hex!\n";
$d =~ /^\d+$/ or die "Wrong format for decimal!\n";
$x = hex($x);
$x == $d ? "Even" : "Odd";
} || $@;
Fällt in einem eval{}Block eine Exception, ist die Rückgabe nicht näher definiert und der zur Exception gehörige Fehlertext ist in $@
zu finden. Damit kann man den Code vereinfachen dadurch daß einfach eine Exception geworfen wird anstatt alle Prüfungen in eine Kontrollstuktur zu setzen.
Obenstehender Code hat also Benutzereingaben zu prüfen, insbesondere ob die Zahlen im richtigen Format sind. Sollte das nicht der Fall sein, wird eine Ex geworfen bspw. die "Wrong format for hex!\n";
wobei der angehängte Zeilenvorschub bewirkt, daß kein Backtrace erzeugt wird.
Im Fehlerfall an $x
geht also Wrong format for hex!
in die print()-Ausgabe. Analog wird mit der anderen Zahl verfahren. Sofern beide Zahlen im richtigen Format vorliegen, gibt der eav{}Block das Ergebnis der in diesem Block notierten letzten Zeile zurück, bei Gleichheit also Even
ansonsten Odd
.
Wenn man sicherstellen kann, daß sich Funktionen erwartungsgemäß verhalten kann man die Prüfung auch der Funktion selbst überlassen:
my $x = 'x';
my $d = '255';
print eval{
$d =~ /^\d+$/ or die "Wrong format for decimal!\n";
$x = hex($x) or die "Wrong format for hex!\n";
$x == $d ? "Even" : "Odd";
} || $@;
und den Code damit weiter vereinfachen. Mit die()
geworfene Exceptions werden also aufgefangen, das Programm endet mit status 0. Wer seine Module aus der Hand gibt, sollte anstelle die()
jedoch Carp::croak()
oder ::confess() verwenden womit in jedem Fall ein Backtrace erzeugt wird der für den Anwender gedacht ist. Authoren ungezählter Module, die auf CPAN zu finden sind, setzen Konstrukte dieser Art erfolgreich ein.
MfG