如何在Perl 6中打开字符串上的文件句柄?

che*_*nyf 6 string perl filehandle perl6

在Perl 5中,我可以在字符串上打开文件句柄,如下所示:

open my $kfh, "<", \$message->payload;
Run Code Online (Sandbox Code Playgroud)

我有一个场景,使用字符串作为文件句柄并将其传递给open方法:

my $fh = new IO::Zlib;
open my $kfh, "<", \$message->payload;
if($fh->open($kfh, 'rb')){
   print <$fh>;
   $fh->close;
}
Run Code Online (Sandbox Code Playgroud)

其中$message->payload从读取卡夫卡,并且内容是一个字节数组.raiph有一个类似的问题,但它没有回答我的问题.

所以我想知道如何在Perl 6中的字符串上打开文件句柄,就像Perl 5一样?这些文档页面没有关于此的信息:

cal*_*ter 4

编辑:看到这个问题,了解如何执行 @raiph 所说的有关打开字符串的文件句柄的操作。另外,请阅读@raiph 的评论。

这是如何从字符串打开文件的文件句柄,而不是如何在不涉及文件的情况下打开字符串的文件句柄。感谢@raiph 澄清了 OP 的含义。


该文档有一个名为“输入/输出”的部分描述了此过程。

读取文件内容的一种方法是通过带有 :r(读取)文件模式选项的 open 函数打开文件并读取内容:

my $fh = open "testfile", :r;
my $contents = $fh.slurp-rest;
$fh.close;
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用 IO::Handle 对象上的 close 方法显式关闭文件句柄。这是读取文件内容的非常传统的方式。然而,同样可以更容易、更清楚地完成,如下所示:

my $contents = "testfile".IO.slurp;
# or in procedural form: 
$contents = slurp "testfile"
Run Code Online (Sandbox Code Playgroud)

通过将 IO 角色添加到文件名字符串,我们可以有效地将字符串引用为文件对象本身,从而直接获取其内容。请注意,slurp 会为您负责打开和关闭文件。

这也可以在 Perl5 到 Perl6 页面中找到。

在 Perl 5 中,读取文本文件行的常见习惯用法如下:

open my $fh, "<", "file" or die "$!";
my @lines = <$fh>;                # lines are NOT chomped 
close $fh;`
Run Code Online (Sandbox Code Playgroud)

在 Perl 6 中,这已被简化为

my @lines = "file".IO.lines; # auto-chomped

在文档中可以找到执行此操作的更多参考IO::Handle

封装一个句柄的实例IO::Handle来操作输入/输出资源。通常不需要直接创建IO::Handle实例,因为它将由其他角色和方法完成。例如,一个IO::Path对象提供了一个 open 方法,该方法返回一个IO::Handle

my $fh = '/tmp/log.txt'.IO.open;
say $fh.^name; # OUTPUT: IO::Handle 
Run Code Online (Sandbox Code Playgroud)