在perl模块中使用sigtrap,如何在对象上下文中收到回收的陷阱?

Dar*_*nke 2 perl signals module

在我的模块的BEGIN部分中有以下内容:

use sigtrap qw(handler shutdown normal-signals);
use sigtrap qw(die untrapped normal-signals stack-trace any error-signals);
Run Code Online (Sandbox Code Playgroud)

但是当sigtrap捕获INT等时,我在关闭子中获得的内容只包含陷阱而不是对象句柄.没有$ self.

sub shutdown {
    my $sig = shift || 'Nothing';   
    print "Got signal: $sig\n";
    exit;
}
Run Code Online (Sandbox Code Playgroud)

简单地回来

Got signal: INT
Run Code Online (Sandbox Code Playgroud)

我的DESTROY在此之后正确调用并且可以访问对象句柄,但由于我在关机时无法访问句柄,因此我无法存储它并且不知道信号是什么.

我需要知道我得到了什么陷阱,所以我的DESTROY方法可以记录导致关闭的原因.

也许sigtrap不是这里的最佳选择.意见欢迎.

Axe*_*man 5

我检查过sigtrap,它不是特定的OO模块,如果你想将它作为一个模块使用,你可能需要使用闭包而不是对象方法.

所以你可以这样定义你的类:

package SigHandler;

sub new { 
    my $class = shift;
    return bless { @_ }, $class;
}

sub on_signal_int { 
    my $self = shift;
    ...
}

sub get_handler { 
    my $self       = shift;
    my @other_args = shift;
    ...
    return sub { 
        my $sig = shift;
        if ( $sig == INT ) { 
            return $self->on_signal_int();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

use handler => SigHandler->new->get_handler, 'normal-signals';
Run Code Online (Sandbox Code Playgroud)