gpt4 book ai didi

raku - 二进制模式下的 Perl 6 $*ARGFILES.handles?

转载 作者:行者123 更新时间:2023-12-04 12:27:07 24 4
gpt4 key购买 nike

我正在尝试 $*ARGFILES.handles ,它似乎以二进制模式打开文件。

我正在编写一个 zip-merge 程序,它从每个文件中打印一行,直到没有更多的行可供读取。

#! /usr/bin/env perl6

my @handles = $*ARGFILES.handles;

# say $_.encoding for @handles;

while @handles
{
my $handle = @handles.shift;
say $handle.get;
@handles.push($handle) unless $handle.eof;
}

我这样调用它:zip-merge person-say3 repeat repeat2

它失败了:无法在 ./zip-merge 第 7 行的块中以二进制模式对句柄执行“获取”

指定的文件是文本文件(以 utf8 编码),我收到了非可执行文件和可执行文件(使用 perl6 代码)的错误消息。

注释掉的行说我给它的每个文件都是 utf8,所以它们不应该是二进制的,

perl6 -v:这是基于 MoarVM 版本 2018.10 构建的 Rakudo 版本 2018.10

我做错了什么,还是我发现了错误?

最佳答案

.handles 的 IO::Handle 对象退货已关闭。

my @*ARGS = 'test.p6';
my @handles = $*ARGFILES.handles;
for @handles { say $_ }
# IO::Handle<"test.p6".IO>(closed)
如果您只是想让代码工作,请在分配给 @handles 后添加以下行.
.open for @handles;
原因是 .handles 的迭代器是按照 IO::CatHandle.next-handle 写的它打开当前句柄,并关闭前一个句柄。
问题是,在您有机会对它们进行任何工作之前,它们都有机会成为当前句柄和前一个句柄。
(也许 .next-handle 和/或 .handles 需要一个 :!close 参数。)

假设您希望它像 roundrobin 一样工作我实际上会更像这样写:
# /usr/bin/env perl6
use v6.d;

my @handles = $*ARGFILES.handles;

# a sequence of line sequences
my $line-seqs = @handles.map(*.open.lines);
# Seq.new(
# Seq.new( '# /usr/bin/env perl6', 'use v6.d' ), # first file
# Seq.new( 'foo', 'bar', 'baz' ), # second file
# )

for flat roundrobin $line-seqs {
.say
}

# `roundrobin` without `flat` would give the following result

# ('# /usr/bin/env perl6', 'foo'),
# ('use v6.d', 'bar'),
# ('baz')
如果您为 $line-seqs 使用了数组,在将它们传递给 .<> 之前,您需要对这些值进行细化( roundrobin ) .
for flat roundrobin @line-seqs.map(*.<>) {
.say
}

实际上,我个人更可能写一些类似于这个(长)单行的东西。
$*ARGFILES.handles.eager».open».lines.&roundrobin.flat.map: *.put

关于raku - 二进制模式下的 Perl 6 $*ARGFILES.handles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53639771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com