2015-10-26 30 views
3

在Perl 6中,Str类型是不可变的,所以使用可变缓冲区而不是连接很多字符串似乎是合理的。接下来,我喜欢能够使用相同的API,无论我的函数是写入标准输出,文件还是写入内存缓冲区。如何“说”并“打印”到缓冲区中?

在Perl中,我可以创建一个在内存中的文件,像这样

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

如何做到同样的事情在Perl 6?

+2

CF https://stackoverflow.com/questions/28702850/i-can-create-filehandles-to-strings-in- Perl的5-怎么办 - 我 - 做它在-perl的-6 – Christoph

回答

2

我目前所做的是将一个字符串串联在一个类中作为临时解决方案。

class Buffer { 
    has $!buf = ""; 
    multi method print($string) { 
     $!buf ~= $string; 
    } 
    multi method say($string) { 
     $!buf ~= $string ~ "\n"; 
    } 
    multi method Str() { 
     return $!buf; 
    } 
} 

就这样,我可以做

my $buf = Buffer.new(); 
say $buf: "asdf"; 
print $buf.Str; 
3

有由数组支持的ecosystem最小IO::String

对于一次性的解决方案,你也可以做些事情像

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;