5

似乎反引号中的变量在传递给 readpipe 函数时没有扩展。如果我重写 readpipe 函数,我如何扩展变量?

BEGIN {
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"};
}

`ls /root`;
my $dir = "/var";
`ls $dir`;

运行这个给出:

Run:ls /root
Run:ls $dir

我正在尝试模拟我正在编写的测试代码的外部调用。如果某个地方有一个 CPAN 模块可以帮助解决所有这些问题,那也会有所帮助。

更新

我决定对我的问题使用一个非常丑陋的解决方法。事实证明,使用readpipe()而不是反引号可以正确扩展变量。我在运行测试之前使用自动脚本清理器,它将所有反引号转换为readpipe()在运行测试之前。

例如运行:

$ cat t.pl

BEGIN {
    *CORE::GLOBAL::readpipe = sub {print "Run:@_\n"};
}

`ls /root`;
my $dir = "/var";
`ls $dir`;
readpipe("ls $dir");

给出:

$ perl t.pl
Run:ls /root
Run:ls $dir
Run:ls /var

不过,我仍在寻找更清洁的解决方案。

4

2 回答 2

3

这似乎是 Perl 中的一个错误。使用perlbug报告它。

于 2012-06-14T06:54:57.507 回答
1

您可能想IPC::Run改用。

use IPC::Run 'run';

run [ "ls", $dir ], ">", \my $stdout or die "Cannot run - $!";

或者,如果您不想捕获输出,system()可能会更好

system( "ls", $dir ) == 0 or die "Cannot system - $!";
于 2012-06-14T09:27:21.593 回答