我正在进一步玩Raku的CommaIDE,我想逐行打印一个二进制文件。我试过了,但没用:
for "G.txt".IO.lines -> $line {
say $_;
}我该怎么修呢?这显然是不正确的。
编辑--这也不起作用,请参阅下面的片段
for "G.txt".IO.lines -> $line {
say $line;
}

发布于 2021-06-07 18:17:50
您向我们展示了h.raku,但是逗号给了您一个关于c.raku的错误,这是逗号项目中的其他文件。
看起来你在处理一个文本文件,而不是二进制文件。Raku在这里做了一个明确的区分:无论编码如何,文本文件都被视为文本。如果是UTF-8,现在使用.lines应该会很好,因为这是默认的。如果是其他编码,可以调用.lines(:enc<some-other-encoding>)。如果它是真正的二进制,那么“行”的概念实际上没有任何意义,您需要更像.slurp(:bin)的东西,这将为您在字节级别上工作提供一个Buf[uint8]。
发布于 2021-06-01 23:10:53
这个问题特别提到读取二进制文件,根据文件的不同,按行读取可能(或不可能)有意义。
下面的代码可以直接从文档中读取二进制文件(使用类 IO::CatHandle):
~$ raku -e '(my $f1 = "foo".IO).spurt: "A\nB\nC\n"; (my $f2 = "foo"); with IO::CatHandle.new: $f2 {.encoding: Nil; .slurp.say;};'
Buf[uint8]:0x<41 0A 42 0A 43 0A>与使用默认编码(utf8)读取文件相比:
~$ raku -e '(my $f1 = "foo".IO).spurt: "A\nB\nC\n"; (my $f2 = "foo"); with IO::CatHandle.new: $f2 {.slurp.say;};'
A
B
C请参阅:https://docs.raku.org/routine/encoding
注意:read方法使用类 IO::Handle,默认情况下读取二进制。因此,代码很简单:
~$ raku -e '(my $file1 = "foo".IO).spurt: "A\nB\nC\n"; my $file2 = "foo".IO; given $file2.open { .read.say; .close;};'
Buf[uint8]:0x<41 0A 42 0A 43 0A>请参阅:https://docs.raku.org/type/IO::Handle#method_read
有关进一步阅读,请参阅对Perl5 5的<>钻石-等效于Raku的讨论:
https://docs.raku.org/language/5to6-nutshell#while_until
...and的一些(旧的)邮件列表讨论相同:
https://www.nntp.perl.org/group/perl.perl6.users/2018/11/msg6295.html
最后,文档在这里编写了一个混合的utf8 8/二进制文件(对于进一步的测试很有用):https://docs.raku.org/routine/encoding#Examples
https://stackoverflow.com/questions/67777736
复制相似问题