警报转义 Perl 'eval' 块

2023-11-29

我有一个 Perl 脚本,可以自动从各种来源下载内容。它在一个eval块与alarm这样,如果时间太长,尝试就会超时:

eval {
    alarm(5);
    my $res = $ua->request($req);
    $status = $res->is_success;
    $rawContent = $res->content;    
    $httpCode = $res->code;
    alarm(0);       
};

这已经工作了很多年,但是在进行了一些系统更新之后,突然就不再工作了。相反,它命中的第一个源超时,我收到以下错误并且程序终止:

 Alarm clock

我做错了什么阻碍了eval突然接到警报?


SIGALRM默认是终止程序,所以需要处理它。一种常见的方式是发出die当 SIGALRM 被捕获时,将其转为异常,即eval-ed.

eval {
    local $SIG{ALRM} = sub { die "Timed out" };
    alarm(5);
    my $res = $ua->request($req);
    $status = $res->is_success;
    $rawContent = $res->content;    
    $httpCode = $res->code;
    alarm(0);       
};
if ($@ and $@ !~ /Timed out/) { die }  # re-raise if it is other error

From 信号输入perlipc

信号处理也用于 Unix 中的超时,同时在内部安全地受到保护eval{}块,您设置一个信号处理程序来捕获警报信号,然后安排在几秒钟内将警报信号发送给您。然后尝试您的阻止操作,在完成后清除警报,但在退出之前不要清除警报。eval{}堵塞。如果它发生了,您将使用 die() 跳出块,就像在其他语言中使用 longjmp() 或 throw() 一样。


至于它是如何工作的,我能想到的一件事是里面使用的包eval有自己的计时器,基于alarm,从而取消您的alarm. From alarm

一次只能有一个计时器在计时。每次调用都会禁用前一个计时器,并且可以提供参数 0 来取消前一个计时器而不启动新的计时器。

他们可能在超时时抛出异常,而您却有预期的行为。此包行为在更新中发生了变化,现在您的警报可以工作并需要处理。当然,这只是猜测。

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

警报转义 Perl 'eval' 块 的相关文章

  • 使用 perl 比较两个 Unicode 字符串

    当我运行以下代码时 它不会进入 在此处执行某些操作 部分 my a P 3 lt 1 my b P 3 lt 1 if a ne b do something here 还有另一种方法可以将 Unicode 字符串与 perl 进行比较吗
  • CPAN shell 内存不足。在 Unix 上如何给它更多的内存?

    我得到一个Out of memory 所有安装的消息 我以前从未使用过 cpan 并且不太确定它是如何工作的 我做了一个ulimit在 cpan 目录中 结果是无限的 这是我正在看的内容 usr bin perl MCPAN e shell
  • Perl 中字符串之间的字符匹配计数

    我有一个字符串 例如字符串 1 需要与另一个字符串 字符串 2 匹配 两个字符串的长度相同并且不区分大小写 我想打印两个字符串之间的字符匹配数 E g String 1 stranger String 2 strangem Match co
  • Python 中 eval("input()") 和 eval(input()) 之间的区别

    我正在尝试以下功能 x eval input 输入为 123 x 的类型也是int 它工作正常 In 22 x eval input enter enter 123 In 24 print type x
  • Perl 导入到我的所有包中?

    我倾向于经常使用 Data Dumper 最终我的 pl 代码中每个包的顶部都有以下样板 use strict use warnings use Data Dumper Data Dumper Deparse 1 Data Dumper P
  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • 由于 lpcap,CPAN 安装 Net::Pcap 和 Packet 模块失败

    最近 我尝试通过 cpan 安装 perl 模块 Net Packet 和 Net Pcap 但它抱怨找不到 pcap 库 所以我正在搜索 cpan 在安装模块时是否接受外部 lib include 目录 但到目前为止还没有运气 looki
  • 你能挽救我的负面回顾示例来传达数字吗?

    在 高级正则表达式 一章中掌握 Perl http oreilly com catalog 9780596527242 我有一个损坏的示例 我无法找到一个很好的修复方法 这个例子可能为了自己的利益而试图变得太聪明 但也许有人可以帮我解决它
  • 如何用perl逐句读取文本文件?

    我想逐句读取文本文件 我的问题是下面的代码仅根据时期分开 usr bin perl use strict use warnings my file data txt open FILE file my buffer while my sen
  • 如何使用 Perl CGI 脚本提供图像?

    我的 Google fu 让我失望了 如何使用 Perl 提供已生成的图像 Example img src getimage pl getimage pl 里有什么 干得好 usr bin perl w my file inner nav
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • 在 Perl 中使用数据引用的正确方法

    我有一组想要处理的数据 为了简化我的代码 最好通过指向原始数据的引用数组来访问我的数据的某些子集 比解释更好的是 我写下了这个例子 它还没有工作 最后 我想更新原始数据 而不必更新所有子集 用 Perl 可以做这样的事情吗 usr bin
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • 对客户端 JavaScript 计算器使用 eval 安全吗?

    我正在制作一个计算器 作为用户浏览器的静态 HTML 页面 该页面并非旨在将任何信息提交回服务器 除了这个计算器之外 网页上不会出现任何其他内容 在这种情况下使用 eval 安全吗 或者换句话说 在这种情况下使用 eval 是否会导致额外的
  • 为什么我的 Apache2::Log 输出用 \n 替换换行符?

    我在 apache2 mod perl 下设置了多个虚拟主机 我用的是ErrorLog指令为每个虚拟主机获取单独的错误日志 仅当我使用 Apache2 Log 时 这才按预期工作 警告 只会记录到常规错误日志中 这样就可以了 最后 但还存在
  • Perl 程序如何知道在哪里可以找到包含它使用的 Perl 模块的文件?

    如果我的 Perl 程序使用 Perl 模块 它将如何确定在哪里找到包含模块代码的文件 例如 如果程序包含 use MyModule1 Example 1 use This Here MyModule2 Example 2 它会看起来在哪里
  • 如何彻底删除 Perl 中的包?

    如何在 Perl 中彻底删除一个包 这不仅意味着包变量 还意味着 Perl 更新以处理继承更改和其他事情的任何魔术表 这个简单的测试 use warnings use strict use Test LeakTrace use Symbol
  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • 如何在 Perl 中获取本周的日期?

    我有以下循环来计算本周的日期并将其打印出来 它有效 但我正在考虑 Perl 中日期 时间可能性的数量 并且想听听您对是否有更好的方法的意见 这是我写的代码 usr bin env perl use warnings use strict u

随机推荐

  • 容器中的文本字段 - 键盘隐藏文本

    我在底部的容器 VBox 中有一个 TextField 当我选择文本字段输入一些文本时 它会隐藏在键盘后面 iPhone 我把 VBox 放在 ScrollPane 中 但还是一样 我可以以某种方式让键盘获得其高度吗 如何放置键盘未覆盖的文
  • deSolve 包参数可以包含矩阵吗?

    我正在尝试编写一个按年龄分层的 SEIR 模型 也就是说 在我的微分方程中 我有一个群体行动参数 它是 20 个年龄段的 beta 感染比例 易感人数 的总和 传输系数 是根据接触矩阵计算得出的 接触矩阵有 20 列和行 代表年龄类别 行
  • 使用 std::vector 初始化 Eigen::vector

    我以前见过它 但我不记得如何有效地初始化Eigen Vector已知长度的std vector相同长度的 这是一个很好的例子 std vector
  • Elastic Search 批量 API、管道和 Geo IP

    我使用 Bulk API 将数据导入到我的 ELK 堆栈 index index waf type logs id 325d05bb6900440e id 325d05bb6900440e country US ip 1 1 1 1 pro
  • 如何在 SWT / Java 应用程序中禁用 Mac 操作系统中的全屏按钮?

    我正在开发 SWT 应用程序 它在 Windows 上运行良好 但当我在 Mac 上运行相同的代码时 我的外壳右上角有一个全屏按钮 单击该全屏按钮后 应用程序停止响应并且没有任何反应 我想禁用该全屏按钮的点击 display Display
  • 在使用 GNU 编译器进行编译期间更改 Linux 中 C++ 应用程序的堆栈大小

    在 OSX 中 C 程序编译期间g I use LD FLAGS Wl stack size 0x100000000 但在 SUSE Linux 中我经常遇到如下错误 x86 64 suse linux bin ld unrecognize
  • 在这个例子中 Angular *ngFor 究竟是如何工作的?

    我对 Angular 2 很陌生 对 JavaScript TypeScript 不太感兴趣 我来自 Java 并且我对我正在研究的一个示例有一些疑问 该示例涉及组件如何使用另一个组件中定义的属性 属性 事件绑定 该示例展示了如何在父组件中
  • MVC 3 客户端对带有数据注释的集合进行验证 - 不起作用

    我正在尝试让客户端验证在我的模型上工作 到目前为止它还不起作用 我的模型有一个集合属性 public class NewsEventsModel public List
  • url重写中=$1是什么意思?

    我在 stackoverflow 或 google 上找不到任何有关其含义的信息 1 我得到的信息很肤浅 但对于像我这样的初学者来说却一无所获 它有什么作用 如果我有这样的事情 www website com profile php sim
  • 使用复合聚集索引时,SQL Server 是否会跳叶?

    考虑以下复合聚集索引 CREATE UNIQUE CLUSTERED INDEX ix mytable ON mytable a b 显然 一个单独的索引b将使搜索的特定值b faster 但是 如果单独的索引b is not就业 在我看来
  • 有人可以解释一下这个 bash 结束时符号的内部工作原理吗:“_ {} \;”

    我在 shell 中运行以下命令来批量转换 HEIC文件到 JPG文件 命令成功 但是有一部分我不明白 find name HEIC exec sh c magick convert 1 1 HEIC JPG 显然 分配行为find结果到
  • 带属性的 python 枚举

    考虑 class Item def init self a b self a a self b b class Items GREEN Item a b BLUE Item c d 有没有办法使简单枚举的思想适应这种情况 看这个问题 理想情
  • 在管理面板中获取产品 ID

    如何在管理面板 目录 管理产品 选项卡中获取当前产品ID 我有一个自定义产品选项卡 但不知道如何获取当前产品 ID 在前端我会做这样的事情 如果你看Mage Adminhtml Catalog ProductController您将两次看到
  • Keycloak 9.0.2:缺少脚本映射器

    使用 keycloak 9 0 2 我们必须在客户端中使用脚本映射器来添加标头请求中的特定声明 但映射器类型中缺少脚本映射器 这是我们的 docker compose 文件的摘录 version 3 4 services keycloak
  • 将网络接口绑定到 Apache httpclient

    我在有两个网卡的机器上使用 Apache HttpClient 我找不到如何绑定 HttpClient 以仅使用其中一个网卡 我找到了一些解决方案 但它们现在都已贬值 我正在使用 Apache HttpClient 4 5 2 是否有使用
  • 制作具有多个 y 轴的条形图

    我有一些数据想用条形图表示 AAA 2 3 1 5 3 5 3 3 1 5 3 1 8 3 5 3 2 8 figure bar 1 2 AAA BarWidth 1 但我想对每一行的前三个条使用一个 y 轴AAA第四个则不同 我无法使用p
  • Objective-C 中的 alloc、init 和 new [重复]

    这个问题在这里已经有答案了 一本关于 iPhone 编程的书实例化了这样的类 Class alloc init 另一本关于 Objective C 的书是这样写的 Class new 有什么不同 new字面意思是这样实现的 id new r
  • 比较 Swift 中的 AnyObject

    我在将此 Objective C 代码移植到 Swift 时遇到问题 该代码必须按给定的顺序对目录的内容进行排序property NSArray contents fileManager contentsOfDirectoryAtURL d
  • junit.framework.AssertionFailedError:在 xyz 包中找不到测试

    当我尝试从 ANT 任务运行 Junits 时 出现此错误 使用 eclipse 启动器它工作正常 junit 版本为 4 9 ANT 版本为 1 7 令人惊讶的是它给出了 junit framework AssertionFailedEr
  • 警报转义 Perl 'eval' 块

    我有一个 Perl 脚本 可以自动从各种来源下载内容 它在一个eval块与alarm这样 如果时间太长 尝试就会超时 eval alarm 5 my res ua gt request req status res gt is succes