2015-10-26 34 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;