Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

exitを捕捉する

通常は、Youがdeadならdieしちゃいなよ、ということでdie→evalして例外を捕捉する。
が、常識外れのexitで勝手に終わっちゃっているプログラムをなんとかする。


最初はシグナルハンドラというか疑似シグナルでなんとかなるかなーと思っていたけれど、それではだめみたい。
END のサブルーチンでひっかけるか、もうexit自体をdieするように書き換えるしかない、と思う。


コードはやっつけ。ディオ様はやばくなると逃げてしまう。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/ say /;

package Character;
use parent qw/ Class::Accessor::Lvalue::Fast /;
__PACKAGE__->mk_accessors(qw/ hp cry_border power /);

package main;

my $dio  = Character->new({ hp => 100, cry_border => 10 });
my $jojo = Character->new({ power => 8 });

while (1) {

  say "オラ!";
  $dio->hp = $dio->hp - $jojo->power;

  if ($dio->hp <= $dio->cry_border) {
    exit; # さすがディオ!俺達に(ry

    say "このディオが涙だとッ!!?";
  }

  last if $dio->hp < 0;
}
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!
オラ!

オラ?


ENDでひっかける

どこかに以下のコードを入れる。

END {
  if ($dio->hp <= $dio->cry_border) {
    say "このディオが涙だとッ!!?";
  }
}
exitを書き換える

どこかに以下のコードを入れる。

BEGIN { *CORE::GLOBAL::exit = sub { ... } }


うーんどちらにしろすごく大げさ、大仰、大事になってしまっている。
もう少し局所的に対処したいけれど、できないか。
つーかdieで死んどけってお話ですね。