Search code examples
iorakurakudo

How do I `say` and `print` into a buffer?


In Perl 6 the Str type is immutable, so it seems reasonable to use a mutable buffer instead of concatenating a lot of strings. Next, I like being able to use the same API regardless if my function is writing to stdout, file or to an in-memory buffer.

In Perl, I can create an in-memory file like so

my $var = "";
open my $fh, '>', \$var;
print $fh "asdf";
close $fh;
print $var;          # asdf

How do I achieve the same thing in Perl 6?


Solution

  • There's a minimal IO::String in the ecosystem backed by an array.

    For a one-off solution, you could also do someting like

    my $string;
    my $handle = IO::Handle.new but role {
        method print(*@stuff) { $string ~= @stuff.join };
        method print-nl       { $string ~= "\n" }
    };
    
    $handle.say("The answer you're looking for is 42.");
    dd $string;