Raku,Perl 的 5 `<>` 在哪里?

问题描述

我正在进一步使用 Raku 的 CommaIDE,我想逐行打印一个二进制文件。 我试过这个,但它不起作用:

for "G.txt".IO.lines -> $line {
    say $_;
    }

我该如何解决?这显然是错误的。

编辑 这也不起作用,请参阅下面的代码段

for "G.txt".IO.lines -> $line {
    say $line;
    }

enter image description here

解决方法

您向我们展示了 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...