我正在进一步使用 Raku 的 CommaIDE,我想逐行打印一个二进制文件。我试过这个,但它不起作用:
for "G.txt".IO.lines -> $line {
say $_;
}
我该如何解决?这显然是不正确的。
编辑 这也不起作用,请参阅下面的片段
for "G.txt".IO.lines -> $line {
say $line;
}
我正在进一步使用 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
方法使用默认读取二进制的类。 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