如何“说”和“打印”到缓冲区?

时间:2015-10-26 16:18:16

标签: io perl6 rakudo

在Perl 6中,Str类型是不可变的,因此使用可变缓冲区而不是连接大量字符串似乎是合理的。接下来,无论我的函数是写入stdout,文件还是内存缓冲区,我都希望能够使用相同的API。

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

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

如何在Perl 6中实现相同的功能?

2 个答案:

答案 0 :(得分:3)

数组支持的IO::String中有一个最小ecosystem

对于一次性解决方案,您也可以像

那样做
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;

答案 1 :(得分:2)

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

            string userName = System.IO.File.ReadAllText(fileToWrite);

            if (System.IO.File.Exists(fileToCopy))
            {
                System.IO.File.Copy(fileToCopy, newLocation, true);
            }
            else
            {
                MessageBox.Show("No such file");
                return;
            }

            System.IO.StreamReader objReader;
            objReader = new System.IO.StreamReader(fileToWrite);
            do
            {
                userName = userName.Replace("user", System.Environment.UserName);
                textLine = textLine + objReader.ReadLine() + "\r\n";
            } while (objReader.Peek() != -1);
            {
                System.IO.StreamWriter objWriter;
                objWriter = new System.IO.StreamWriter(newLocation, true);
                objWriter.Write(userName);
                objWriter.Close();
            }
            objReader.Close();

有了这个,我可以做到

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