use*_*716 8 printf while-loop raku commaide
我正在进一步使用 Raku 的 CommaIDE,我想逐行打印一个二进制文件。我试过这个,但它不起作用:
for "G.txt".IO.lines -> $line {
say $_;
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决?这显然是不正确的。
编辑 这也不起作用,请参阅下面的代码段
for "G.txt".IO.lines -> $line {
say $line;
}
Run Code Online (Sandbox Code Playgroud)
该问题特别涉及读取二进制文件,对于该文件,逐行读取可能(或可能不)有意义 - 取决于文件。
这是直接从文档中读取二进制文件的代码(使用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>
Run Code Online (Sandbox Code Playgroud)
与使用默认编码 ( 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
Run Code Online (Sandbox Code Playgroud)
请参阅: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>
Run Code Online (Sandbox Code Playgroud)
请参阅:https : //docs.raku.org/type/IO :: Handle#method_read
如需进一步阅读,请参阅<>Raku中 Perl5 的 Diamond -operator-equivalent 的讨论:https :
//docs.raku.org/language/5to6-nutshell#while_until
...以及一些(较旧的)邮件列表讨论:https :
//www.nntp.perl.org/group/perl.perl6.users/2018/11/msg6295.html
最后,文档提到在此处编写混合 utf8/binary 文件(用于进一步测试):https : //docs.raku.org/routine/encoding#Examples
小智 5
您正在向我们展示,h.raku但逗号给您一个关于 的错误c.raku,这是您逗号项目中的其他文件。
看起来您正在使用文本文件,而不是二进制文件。Raku 在这里做了一个明确的区分:无论编码如何,文本文件都被视为文本。如果它是 UTF-8,则按.lines现在的方式使用应该可以正常工作,因为这是默认设置。如果是其他编码,则可以调用.lines(:enc<some-other-encoding>). 如果它真的是二进制的,那么“行”的概念真的没有意义,你想要更像 的东西.slurp(:bin),它会给你一个Buf[uint8]在字节级别上工作的东西。