perl - 使用 CTRL + C 终止当前的 LWP 请求

标签 perl lwp

我有一个基于 Term::ReadLine 和 LWP::UserAgent 的脚本

逻辑是这样的,

while (defined ($_ = $term->readline('console> ')))
{
    next unless $_; chomp;

    if ($_ eq 'exit')
    {
        last;
    }
    &run ($_);
}

sub run {
    my $ua   = LWP::UserAgent->new;
    my $resp = $ua->get (...);

    say $resp->content;
}

run中它将执行一个LWP请求。现在,如果我按 CTRL + C,不仅 LWP 会终止,整个 Perl 脚本也会终止。

我只想终止 LWP 请求。有任何想法吗?

我可以添加一个 SIGINT 处理程序,但我不知道该处理程序应该做什么

最佳答案

将信号转换为异常。

local $SIG{INT} = sub { die "SIGINT\n" };

通常,人们会将代码包装在 eval BLOCK 中,但 LWP::UserAgent 会捕获这些异常并返回错误响应。

例如,

use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $response = do {
   local $SIG{INT} = sub { die "SIGINT\n" };
   $ua->get("http://localhost/zzz.crx")
};
say $response->is_success ? "Successful" : "Unsuccessful";
say $response->code;
say $response->status_line;

如果没有收到 SIGINT,则输出:

Successful
200
200 OK

收到 SIGINT 时输出:

Unsuccessful
500
500 SIGINT

关于perl - 使用 CTRL + C 终止当前的 LWP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41627980/

相关文章:

perl - grep 目录中的文件名

regex - 重构链接 elsif(使用正则表达式)以在 Perl 中调度表。但是我的代码如何工作?

perl - 如何在LWP中启用IPv6支持?

perl - 如何配置 LWPx::Paranoia Agent 使用/etc/hosts

perl - 通过 Perl 进行 SSH 登录

perl - 给定/何时存在什么样的简洁用例?

perl - 我如何从一个 Perl 模块的子例程中获取它的名称?

regex - 使用 Perl LWP::Simple to Process Online Prices 查询网站

perl - 如何将 LWP 与客户端证书和 CA 一起使用

perl - 使用 LWP - Perl 设置下载速度