问题描述
我正在进一步使用 Raku 的 CommaIDE,我想逐行打印一个二进制文件。 我试过这个,但它不起作用:
for "G.txt".IO.lines -> $line {
say $_;
}
我该如何解决?这显然是错误的。
编辑 这也不起作用,请参阅下面的代码段
for "G.txt".IO.lines -> $line {
say $line;
}
解决方法
您向我们展示了 h.raku
,但 Comma 给您一个关于 c.raku
的错误,这是您的 Comma 项目中的其他文件。
看起来您正在处理文本文件,而不是二进制文件。 Raku 在这里做了一个明确的区分:无论编码如何,文本文件都被视为文本。如果是 UTF-8,现在使用 .lines
应该可以正常工作,因为这是默认设置。如果是其他编码,您可以调用 .lines(:enc<some-other-encoding>)
。如果它真的是二进制的,那么“行”的概念就真的没有意义,你想要更像 .slurp(:bin)
的东西,它会给你一个 Buf[uint8]
来处理字节级别。
该问题具体涉及读取二进制文件,对于该文件,逐行读取可能(也可能不)有意义——具体取决于文件。
这是直接从文档中读取二进制文件的代码(使用class 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
方法使用默认读取二进制文件的 class 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
要进一步阅读,请参阅 Raku 中对 Perl5 的 <>
菱形运算符等效项的讨论:
https://docs.raku.org/language/5to6-nutshell#while_until
...以及一些(较旧的)邮件列表讨论相同的内容:
https://www.nntp.perl.org/group/perl.perl6.users/2018/11/msg6295.html
最后,文档是指在此处编写混合 utf8/二进制文件(用于进一步测试): https://docs.raku.org/routine/encoding#Examples