捕获模块输出

jjm*_*elo 5 io perl6 raku

假设我们有这个模块:

unit module outputs;

say "Loaded";
Run Code Online (Sandbox Code Playgroud)

我们这样加载它

use v6;

use lib ".";

require "outputs.pm6";
Run Code Online (Sandbox Code Playgroud)

这将打印出"已加载" require.假设我们想要捕获该加载模块的标准输出.我们可以这样做,如果它是一个外部进程,但似乎没有办法重定向*OUT到一个字符串,或者,如果不可能,重定向到一个文件.是这样吗?

Håk*_*and 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;
Run Code Online (Sandbox Code Playgroud)

输出:

Finished
Loaded
Run Code Online (Sandbox Code Playgroud)

另请参阅如果我在Perl 6中重新分配OUT,如何将其更改回stdout?


rai*_*iph 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
Run Code Online (Sandbox Code Playgroud)