Perl - eval 不捕获“use”语句

2023-12-28

我想检测用户何时缺少所需的模块,并打印一条友好的错误消息,解释他们需要安装的内容。

到目前为止,我尝试将其放在脚本的开头:

eval {
    use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
};
if ($@) {
    die "Error: IO::Uncompress::Gunzip not installed: $@";
}

但 Perl 似乎死在“use”行而不是“die”行,并且从不打印我的错误消息。


use IO::Uncompress::Gunzip qw( gunzip $GunzipError );

是缩写

BEGIN {
   require IO::Uncompress::Gunzip;
   import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
}

and BEGIN块在编译后立即进行评估。这意味着您的代码会:

  1. Compilation phase:
    1. Compile eval statement.
      1. Compiled BEGIN block.
        1. Compile require IO::Uncompress::Gunzip;
        2. Compile import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
      2. Evaluate BEGIN block.
        1. 评价require IO::Uncompress::Gunzip;
        2. 评价import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
    2. Compile if陈述。
  2. Run phase:
    1. 评价(空)eval陈述。
    2. 评价if陈述。

如果步骤1.1.2.1发生异常,eval在步骤 2.1 中运行不会捕获它!


解决方案:

你从相当于的东西开始

BEGIN {
   require IO::Uncompress::Gunzip;
   import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
}

这是来自的错误require你想抓住,所以只需添加一个eval周围的require:

BEGIN {
   eval { require IO::Uncompress::Gunzip }
      or die "Error: IO::Uncompress::Gunzip not installed: $@";

   import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
}

您也可以推迟use通过使用进行编译(并因此评估)eval EXPR代替eval BLOCK:

BEGIN {
   eval 'use IO::Uncompress::Gunzip qw( gunzip $GunzipError ); 1'
      or die "Error: IO::Uncompress::Gunzip not installed: $@";
}

(我希望有一种好方法来确定模块是否已安装。即使第一个解决方案也会捕获其他错误,第二个解决方案甚至更多。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl - eval 不捕获“use”语句 的相关文章

随机推荐

  • Django 1.8 迁移无法将列 id 转换为整数

    我正在将我的网站从 SQLite 后端迁移到 Postgres 后端 从项目一开始 我们就一直在运行原生 Django 风格的迁移 即不是 South 大多数迁移运行良好 但我们的应用程序出现了问题 我们在 Postgres 迁移中已经走到
  • PHP中有没有SMTP邮件传输库

    我想编写一个电子邮件传输服务 需要用 MTU 替换 sendmail postfix 我不是在寻找如何传递到发送 SMTP 服务器 如 SMTP 端口上的后缀列表 我也不需要服务器的接收部分 反弹等将转到不同的现有后缀 所有这些都是纯 PH
  • 如何从顶部栏/状态栏删除这种灰色

    我有一个应用程序 我将顶部栏 状态栏设置为上升颜色 它适用于棒棒糖上的大多数屏幕 但在其中一个屏幕上出现问题 这是一项活动 代码如下
  • 从 Jekyll 插件返回目录中的文件列表?

    我不知道如何在 jekyll 插件中创建过滤器或标签 以便我可以返回目录并循环其内容 我找到了这些 http pastebin com LRfMVN5Y http pastebin com LRfMVN5Y http snippets dz
  • Python 协议/接口的综合列表[重复]

    这个问题在这里已经有答案了 最近 我在看一些Python 习语 我发现了很多Python中使用的协议的描述 例如排序 cmp 或发电机 除此之外 还有类似的方法 hash 这是为每个对象定义的 我想 在互联网上进行一些搜索后 我还没有找到这
  • 从 UserControl 抽象子类继承

    我有一组用户控件需要具有一些类似的属性 因此 我定义了 UserControl 的一个抽象子类 它定义了这些属性并更新了 xaml cs 和 g cs 文件以从该基类继承 一切都编译良好并且运行良好 伟大的 但是 g cs 文件已生成并将重
  • 在 ASP.net 中返回纯文本或其他任意文件

    如果我要使用 PHP 中的纯文本响应 http 请求 我会执行以下操作 我如何在 ASP NET 中实现同等功能 如果你只想返回这样的纯文本 我会使用 ashx 文件 VS 中的通用处理程序 然后只需在 ProcessRequest 方法中
  • 将数据帧转换为没有列名的嵌套字典

    这是我的 pandas 数据框的示例 它包含接近 100k 行 import pandas as pd df pd DataFrame cluster 5 5 5 5 5 5 mdse item i 23627102 23627102 23
  • 检查文件夹是否有文件

    我有一个程序可以将哪些文件夹已满或为空写入数据库 现在我正在使用 bool hasFiles false Directory GetFiles path Length gt 0 hasFiles true hasFiles false 但这
  • Android:如何使用 Volley 处理来自服务器的消息错误?

    我在用Volley让我的 Android 应用程序从我的服务器获取数据 除非处理来自我的服务器的错误 否则它运行良好 当出现错误时 我的服务器会发送此响应 status 400 message Errors 2 A name is requ
  • Gradle --显示版本

    Maven 的 Gradle 模拟是什么 show version option V show version Display version information WITHOUT stopping build 输出包括 Maven Ja
  • 是否可以替换为 data.table[i, j , by] 中的 `i` 元素

    我想知道是否可以将表达式替换为idata table 的一部分 我设置了一个深度嵌套的列表 其中包含预设参数 以根据用户在闪亮的应用程序中选择的子组来执行子集设置 我怀疑这是不可能的 但我希望能以某种方式得到确认 如果不可能 我欢迎任何替代
  • 更改数组索引以显示下一张幻灯片

  • Homebrew 公式中的替代依赖项(例如与 gcc 一起使用)

    如何在 Homebrew 公式中描述替代依赖关系 我正在考虑两种不同的类型 1 替代套餐 我的公式可能取决于包装P or Q 但它必须有其中之一 所以 我想要 depends on P or depends on Q 我至少需要一个 2 同
  • NSCoder 和自定义类型

    如何使用 NSCoder 来编码和解码自定义类型 例如 您将如何将 NSCoder 与 的实例一起使用 STATE where typedef enum ON OFF STATE 您可以将它们视为整数 因为它们是隐式分配的整数值 void
  • self.view = someController.view 与 [self.view addSubview:someController.view]

    我正在尝试找出我遇到的错误 最初 我的同事只是使用以下命令将视图添加到子视图中 self view addSubview someController view 来自当前 ViewController 这看起来不错 但有点迟缓 我想根据需要
  • 如何将更新的 git-hash 嵌入到 Version.hpp 中?

    原标题 如何让 git 忽略我的文件 无论分支如何 我有以下结账后文件 它按预期工作 usr bin ruby cmd ENV HOME dev pitbull cpp bin gen version rb write cmd gen ve
  • H264 帧查看器

    您知道有什么应用程序可以向我显示单个 H264 帧的所有标头 参数吗 我不需要解码它 我只是想看看它是如何构建的 我想到了三种方法 如果您正在寻找免费的东西 否则谷歌 h264分析 以获取付费选项 下载h 264解析器 http www w
  • 我想使用 SQL 选择查询从选定的月份和年份中找到两个值

    单击此处查看输出 https i stack imgur com if28I png 这是我的选择查询 First query SELECT YEAR SUM amount AS total FROM accounts WHERE MONT
  • Perl - eval 不捕获“use”语句

    我想检测用户何时缺少所需的模块 并打印一条友好的错误消息 解释他们需要安装的内容 到目前为止 我尝试将其放在脚本的开头 eval use IO Uncompress Gunzip qw gunzip GunzipError if die E