Thread exit() abfangen (12 answers)
Opened by bianca at 2016-08-27 09:02

bianca
 2016-08-29 06:29
#185311 #185311
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
2016-08-28T11:50:13 GwenDragon
Code (perl): (dl )
...eval "&{$sub_code}();";...

Sehr cool! Danke dir!

2016-08-28T11:50:13 GwenDragon
Aber ich nehme an, anstatt der Referenz auf die sub den Code selbst mit eval zu starten ist auch keine Lösung in deinem Fall.

Doch, das macht nichts, ist ja nicht in der sub sondern drumherum, das kann man optisch im Code sauber abgrenzen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

# wie kann man zeitweise exit() umleiten?
my $sub_code = q(
#################################################
sub {
    say "bin im sub_code";
    exit();
}
#################################################
;);
say "jetzt soll exit() abgefangen werden";
*CORE::GLOBAL::exit = sub { say "exit() sub"; };    # Quelle: http://stackoverflow.com/a/25376064
eval "&{$sub_code}();";
say "jetzt soll exit() wiederhergestellt werden";
*CORE::GLOBAL::exit = *CORE::exit;  # Quelle: http://stackoverflow.com/a/25376064
eval "&{$sub_code}();";
say "dieser Text darf nicht mehr zu sehen sein";


2016-08-28T11:50:13 GwenDragon
Ich finde den Code als String und das zu verwendende eval grässlich, weiß aber keine andere Lösung.

In dem Fall ist es echt egal, weil das nur zum Testen von sub's ist im Rahmen ihrer "Schöpfung". Und da sind halt verschiedentliche Abgänge mit exit(), deren saubere Funktion ich auch testen möchte.

Aber eine wichtige Frage hab ich noch:
Wie sieht die Syntax aus, wenn die sub kein String sondern eine sub{} ist und ich der sub Parameter übergeben möchte?
Dieser Versuch schlägt fehl mit Fehlermeldung Useless use of a constant ("\n##############################"...) in void context at test_exit.pl line 7.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

# wie kann man zeitweise exit() umleiten?
q(
#################################################
sub sub_code {
    say "bin im sub_code mit Par. '$_[0]'";
    exit();
}
#################################################
;);
say "jetzt soll exit() abgefangen werden";
*CORE::GLOBAL::exit = sub { say "exit() sub"; };    # Quelle: http://stackoverflow.com/a/25376064
eval "&{&sub_code('foo')};";
say "jetzt soll exit() wiederhergestellt werden";
*CORE::GLOBAL::exit = *CORE::exit;  # Quelle: http://stackoverflow.com/a/25376064
eval "&{&sub_code('bar')};";
say "dieser Text darf nicht mehr zu sehen sein";

Übrigens: die eigentliche sub darf zur Lösungsfindung auch gern in einer anderen Datei sein, das macht nichts. Nur in der sub selbst möchte ich nichts ändern müssen.
10 print "Hallo"
20 goto 10

View full thread exit() abfangen