在 perl 5.8.8 中模拟反引号运算符

Posted

技术标签:

【中文标题】在 perl 5.8.8 中模拟反引号运算符【英文标题】:Mocking backticks operator in perl 5.8.8 【发布时间】:2015-12-04 23:26:17 【问题描述】:

我试图在 perl 版本 5.8.8 中模拟反引号运算符。据我了解,无法在 perl 5.8.8 版中模拟它。但是在 perl 5.9 版以后,我可以使用

轻松模拟反引号运算符

*CORE::GLOBAL::readpipe = \&mock_readpipe

有没有办法在 perl 版本 5.8.8 中模拟反引号运算符。我可以模拟 system(),但不能模拟反引号。

【问题讨论】:

readpipe 在 Perl v5.8.9 之前无法被覆盖。我能想到的就是你将反引号包装在一个子程序中,比如execute,如果程序在测试环境中运行,它会做一些不同的事情 是的,我能做到。但我正在寻找直接的解决方案而不是编写包装器。 【参考方案1】:

您可以覆盖 system() 和 readpipe(),因为它们是二等的 (可覆盖的)关键字。在 Perl 5.8 中,您不能覆盖 qx// 或 ``, 即使它们使用与 readpipe() 相同的底层代码, 因为它们是一流的(不可覆盖的)关键字。看 Perl 源代码中的 perl_keywords.pl 和 opcode.pl。为什么有些 关键字不可覆盖?主要原因是这些关键字是 用作一些进一步解析魔法的一部分,即它们不遵循 常用函数调用样式解析。

好消息是,将 #29168 更改为 perl 使得 qx// 可以覆盖。 万岁!这是在 Perl 5.9.5 中发布的,最终会成功 到 Perl 5.10.1 的维护版本。发生这种情况时,设置 *CORE::GLOBAL::readpipe 将覆盖 readpipe()、qx// 和 ``.

阅读关于 perlmonks 的完整讨论:mocking or trapping system calls

还可以查看IPC::System::Simple。

【讨论】:

总而言之,在 perl 5.8.8 中根本无法模拟反引号运算符。谢谢

以上是关于在 perl 5.8.8 中模拟反引号运算符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 脚本中使用 Perl 变量(使用反引号)

使用反引号在 perl 脚本中获取核心文件

Perl中的反斜杠单引号

如何在 perl 中为反引号加载 STDIN(不写入临时文件)

Perl 语法 - 高级特性

在perl的反引号中使用chmod后导致权限的异步更改的原因