Gedacht war: main ruft x, in x wird y gerufen, in y wird z gerufen, und z macht den letzten Seufzer.
Ok dann eben so:
# instanz der main
my $m = bless{};
# eine statische Variable
my $y = 0;
sub x{shift->y}
sub y{shift->z}
sub z{die "seufz"}
print eval{
$m->x;
$y = 99;
} || "$y $@";
Das Ergebnis ist dasselbe. eval fängt die in z() gefallene Ex auf. $y = 99 wird nicht mehr ausgeführt weil im eval{}Block eine ex gefallen ist. Der print zeigt $y mit dem Wert 0 und $@ weist die Zeile aus wo die Ex geworfen wurde.
Was hast Du denn erwartet?
PS: Eine Verkettung von Funktionen like $m->x()->y()->z()
wird möglich wenn jede Funktion die aufrufende Instanz zurückgibt, das geht auch in PHP zu machen. In Perl jedoch ist die aufrufende Instanz das erste einer Funktion übergebene Argument. Desegen ist das Ergebnis dasselbe.