1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; use 5.010; # wie kann man zeitweise exit() umleiten? my $sub_code = 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 $sub_code->(); say "jetzt soll exit() wiederhergestellt werden"; *CORE::GLOBAL::exit = *CORE::exit; # Quelle: http://stackoverflow.com/a/25376064 exit(); say "dieser Text darf nicht mehr zu sehen sein";
Quotejetzt soll exit() abgefangen werden 11
bin im sub_code 8
Quotejetzt soll exit() abgefangen werden 11
bin im sub_code 8
exit() sub 12
jetzt soll exit() wiederhergestellt werden 14
bin im sub_code 8
1 2 3 4 5 6 7 8 9 10 11
my $sub_code = sub { say "bin im sub_code"; eval "exit();"; }; say "jetzt soll exit() abgefangen werden"; *CORE::GLOBAL::exit = sub { say "exit() sub"; }; $sub_code->(); say "jetzt soll exit() wiederhergestellt werden"; *CORE::GLOBAL::exit = *CORE::exit; exit(); say "dieser Text darf nicht mehr zu sehen sein";
1
2
3
4
jetzt soll exit() abgefangen werden
bin im sub_code
exit() sub
jetzt soll exit() wiederhergestellt werden
2016-08-27T10:56:25 GwenDragonWarum dort ein eval sein muss, weiß ich gerade auch nicht.
2016-08-27T15:51:20 GwenDragonEin Missverständnis was Compile- und was zur Laufzeit passiert?
Täusch ich mich?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl use strict; use warnings; use 5.010; # wie kann man zeitweise exit() umleiten? my $sub_code = sub { say "bin im sub_code"; eval "exit();"; # <-- gibt es eine Lösung ohne Änderungen in der sub? }; say "jetzt soll exit() abgefangen werden"; *CORE::GLOBAL::exit = sub { say "exit() sub"; }; # Quelle: http://stackoverflow.com/a/25376064 $sub_code->(); say "jetzt soll exit() wiederhergestellt werden"; *CORE::GLOBAL::exit = *CORE::exit; # Quelle: http://stackoverflow.com/a/25376064 $sub_code->(); say "dieser Text darf nicht mehr zu sehen sein";
Quotejetzt soll exit() abgefangen werden
bin im sub_code
exit() sub
jetzt soll exit() wiederhergestellt werden
bin im sub_code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/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 GwenDragonCode (perl): (dl )...eval "&{$sub_code}();";...
2016-08-28T11:50:13 GwenDragonAber ich nehme an, anstatt der Referenz auf die sub den Code selbst mit eval zu starten ist auch keine Lösung in deinem Fall.
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 GwenDragonIch finde den Code als String und das zu verwendende eval grässlich, weiß aber keine andere Lösung.
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";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; use 5.010; use utf8; say "jetzt soll exit() abgefangen werden"; *CORE::GLOBAL::exit = sub { say "exit() sub"; }; # Quelle: http://stackoverflow.com/a/25376064 do "sub.pl"; sub_code('foo'); say "jetzt soll exit() wiederhergestellt werden"; *CORE::GLOBAL::exit = *CORE::exit; # Quelle: http://stackoverflow.com/a/25376064 do "sub.pl"; sub_code('bar'); say "dieser Text darf nicht mehr zu sehen sein";
1 2 3 4 5 6
################################################# sub sub_code { print "bin im sub_code mit Par. '$_[0]'", "\n"; exit(); } #################################################
Quote?bin im sub_code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
package ExitIgnorer; use 5.10.0; use Exporter qw(import); @EXPORT = qw(ignore_exit_calls restore_exit_calls); our $ignoreExit = 0; *CORE::GLOBAL::exit = sub { if ($ignoreExit) { say "exit(", join(",", map "'$_'", @_), ") sub "; } else { CORE::exit(@_); } }; sub ignore_exit_calls { $ignoreExit = 1; } sub restore_exit_calls { $ignoreExit = 0; } 1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#!/usr/bin/perl use ExitIgnorer; use strict; use warnings; use 5.010; # wie kann man zeitweise exit() umleiten? my $sub_code = sub { say "bin im sub_code"; exit(); }; say "jetzt soll exit() abgefangen werden"; ignore_exit_calls(); $sub_code->(); say "jetzt soll exit() wiederhergestellt werden"; restore_exit_calls(); exit(); say "dieser Text darf nicht mehr zu sehen sein";