3

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

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

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

4

1 回答 1

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 的完整讨论:模拟或捕获系统调用

另请查看IPC::System::Simple

于 2015-09-09T06:29:15.073 回答