我可以在 Perl 5 中为字符串创建文件句柄,在 Perl 6 中我该怎么做?
I can create filehandles to strings in Perl 5, how do I do it in Perl 6?
在 Perl 5 中,我可以为一个字符串创建一个文件句柄,然后从该字符串中读取或写入,就好像它是一个文件一样。这非常适合使用测试或模板。
例如:
use v5.10; use strict; use warnings;
my $text = "A\nB\nC\n";
open(my $fh, '<', $text);
while(my $line = readline($fh)){
print $line;
}
我如何在 Perl 6 中做到这一点?以下 不适用于 Perl 6(至少不适用于我的 Perl6 运行 on MoarVM 2015.01 from the January 2015 release of Rakudo Star on 64 位 CentOS 6.5):
# Warning: This code does not work
use v6;
my $text = "A\nB\nC\n";
my $fh = $text;
while (my $line = $fh.get ) {
$line.say;
}
# Warning: Example of nonfunctional code
我收到错误消息:
No such method 'get' for invocant of type 'Str'
in block <unit> at string_fh.p6:8
Perl5 的 open(my $fh, '<', $text)
与 Perl6 的 my $fh = $text;
不同并不奇怪。所以问题是:如何从 Perl 6 中的字符串创建虚拟文件句柄,就像 Perl 5 中的 open(my $fh, '<', $str)
一样?或者这是尚未实施的事情?
更新(写入 Perl 5 中的文件句柄)
同样,您可以在 Perl 5 中写入字符串文件句柄:
use v5.10; use strict; use warnings;
my $text = "";
open(my $fh, '>', $text);
print $fh "A";
print $fh "B";
print $fh "C";
print "My string is '$text'\n";
输出:
My string is 'ABC'
我还没有在 Perl 6 中看到任何类似的东西。
阅读
逐行阅读的惯用方法是 .lines
method,它在 Str
和 IO::Handle
上都可用。
它 returns 一个惰性列表,您可以将其传递给 for
,如
my $text = "A\nB\nC\n";
for $text.lines -> $line {
# do something with $line
}
写作
my $scalar;
my $fh = IO::Handle.new but
role {
method print (*@stuff) { $scalar ~= @stuff };
method print-nl { $scalar ~= "\n" }
};
$fh.say("OH HAI");
$fh.say("bai bai");
say $scalar
# OH HAI
# bai bai
(改编自 #perl6,感谢 Carl Mäsak。)
更高级的案例
如果您需要更复杂的机制来伪造文件句柄,IO::Capture::Simple and IO::String in the ecosystem。
例如:
use IO::Capture::Simple;
my $result;
capture_stdout_on($result);
say "Howdy there!";
say "Hai!";
capture_stdout_off();
say "Captured string:\n" ~$result;
在 Perl 5 中,我可以为一个字符串创建一个文件句柄,然后从该字符串中读取或写入,就好像它是一个文件一样。这非常适合使用测试或模板。
例如:
use v5.10; use strict; use warnings;
my $text = "A\nB\nC\n";
open(my $fh, '<', $text);
while(my $line = readline($fh)){
print $line;
}
我如何在 Perl 6 中做到这一点?以下 不适用于 Perl 6(至少不适用于我的 Perl6 运行 on MoarVM 2015.01 from the January 2015 release of Rakudo Star on 64 位 CentOS 6.5):
# Warning: This code does not work
use v6;
my $text = "A\nB\nC\n";
my $fh = $text;
while (my $line = $fh.get ) {
$line.say;
}
# Warning: Example of nonfunctional code
我收到错误消息:
No such method 'get' for invocant of type 'Str'
in block <unit> at string_fh.p6:8
Perl5 的 open(my $fh, '<', $text)
与 Perl6 的 my $fh = $text;
不同并不奇怪。所以问题是:如何从 Perl 6 中的字符串创建虚拟文件句柄,就像 Perl 5 中的 open(my $fh, '<', $str)
一样?或者这是尚未实施的事情?
更新(写入 Perl 5 中的文件句柄)
同样,您可以在 Perl 5 中写入字符串文件句柄:
use v5.10; use strict; use warnings;
my $text = "";
open(my $fh, '>', $text);
print $fh "A";
print $fh "B";
print $fh "C";
print "My string is '$text'\n";
输出:
My string is 'ABC'
我还没有在 Perl 6 中看到任何类似的东西。
阅读
逐行阅读的惯用方法是 .lines
method,它在 Str
和 IO::Handle
上都可用。
它 returns 一个惰性列表,您可以将其传递给 for
,如
my $text = "A\nB\nC\n";
for $text.lines -> $line {
# do something with $line
}
写作
my $scalar;
my $fh = IO::Handle.new but
role {
method print (*@stuff) { $scalar ~= @stuff };
method print-nl { $scalar ~= "\n" }
};
$fh.say("OH HAI");
$fh.say("bai bai");
say $scalar
# OH HAI
# bai bai
(改编自 #perl6,感谢 Carl Mäsak。)
更高级的案例
如果您需要更复杂的机制来伪造文件句柄,IO::Capture::Simple and IO::String in the ecosystem。
例如:
use IO::Capture::Simple;
my $result;
capture_stdout_on($result);
say "Howdy there!";
say "Hai!";
capture_stdout_off();
say "Captured string:\n" ~$result;