die()不会退出Perl脚本的情况?

kno*_*orv 6 perl

我正在使用长时间运行的Perl脚本调试一个非常奇怪的问题.

问题是脚本没有die()按预期退出.相反,脚本只是挂起而不返回.

我自己没有定义任何错误处理程序,所以我认为这die()会导致脚本立即终止.

这是脚本的基本结构和使用的模块:

#!/usr/bin/perl

use strict;
use utf8;
use warnings;

use DBI; # with MySQL driver ("dbi:mysql:database=...")
use Geo::IP;
use POSIX;
use URI::Escape;

open(COMMAND, 'command_line |');
while (<COMMAND>) {
    #
    # .. stuff that can go wrong ..
    #
    die("I'm expecting the script to terminate here. It doesn't.") if ($gone_wrong);
}
close(COMMAND);
Run Code Online (Sandbox Code Playgroud)

这种行为有什么解释?是否已知使用的任何模块都可以设置可以解释脚本挂起的错误处理程序die()

cjm*_*cjm 4

嗯,END块和对象析构函数仍然在die. 如果其中之一挂起(或执行需要很长时间的操作),脚本不会立即退出。但这应该在打印消息后发生die(除非 STDERR 被缓冲,因此您不会立即看到消息)。

您提到了 DBI,因此您可能有一个正在调用其析构函数的数据库句柄。(不过,我不确定这就是问题所在。)