捕获模块输出

时间:2019-02-24 20:01:27

标签: io perl6

说我们有这个模块:

unit module outputs;

say "Loaded";

我们这样加载它

use v6;

use lib ".";

require "outputs.pm6";

require d时将打印“已加载”。假设我们要捕获已加载模块的标准输出。如果it's an external process,我们可以这样做,但是似乎没有一种方法可以将*OUT重定向到字符串,或者如果不可能的话,重定向到文件。是吗?

2 个答案:

答案 0 :(得分:8)

您可以尝试使用IO::String

use v6;
use lib ".";
use IO::String;

my $buffer = IO::String.new;
with $buffer -> $*OUT {
    require "outputs.pm6";
};

say "Finished";
print ~$buffer;

输出

Finished
Loaded

另请参阅If I reassigned OUT in Perl 6, how can I change it back to stdout?

答案 1 :(得分:7)

临时重新分配$*OUT,以便.print调用追加到字符串:

my $capture-stdout;

{ 
  my $*OUT = $*OUT but
             role { method print (*@args) { $capture-stdout ~= @args } }

  require "outputs.pm6" # `say` goes via above `print` method 
}

say $capture-stdout; # Loaded