在 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 中模拟反引号运算符的主要内容,如果未能解决你的问题,请参考以下文章