Объекты IO :: Handle, возвращаемые .handles
, закрыты.
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