gpt4 book ai didi

string - 我可以在 Perl 5 中为字符串创建文件句柄,我如何在 Perl 6 中做到这一点?

转载 作者:行者123 更新时间:2023-12-03 23:50:53 24 4
gpt4 key购买 nike

在 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(至少不适用于我在 MoarVM 2015.01 上运行的 Perl6 实例,来自 January 2015 release of Rakudo Star 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 中的字符串创建虚拟文件句柄,如 open(my $fh, '<', \$str)在 Perl 5 中?或者这是尚未实现的东西?

更新(在 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 .

它返回一个惰性列表,您可以将其传递给 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::SimpleIO::Stringecosystem .

例如:
use IO::Capture::Simple;
my $result;
capture_stdout_on($result);
say "Howdy there!";
say "Hai!";
capture_stdout_off();
say "Captured string:\n" ~$result;

关于string - 我可以在 Perl 5 中为字符串创建文件句柄,我如何在 Perl 6 中做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28702850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com