perl - 在哪些情况下 die() 不会退出 Perl 脚本?

标签 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);

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

最佳答案

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

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

关于perl - 在哪些情况下 die() 不会退出 Perl 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686384/

相关文章:

perl - 在不带扩展名的Windows上运行Perl脚本

perl - 在 Perl 中使用 tk 运行重复任务

perl - 我可以在 Perl 中重命名另一个散列中的散列键吗?

xml - 在 Perl 中,如何在不更改 XML 文件格式的情况下更改 XML 文件中的元素?

image - 如何轻松地将 rgb 颜色值转换为十六进制颜色值?

perl - 在 Perl 中获取按修改日期排序的文件列表

perl - 在 perl 中返回一个延迟计算的标量

linux - 如何在不安装 perlbrew 的情况下指定用于脚本的 perl 版本

perl - socket->recv() 与 <>?

perl - 使用 Perl 模块 Image::ExifTool 从 PDF 中读取元信息