首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >二进制模式下的Perl6 $*ARGFILES.handles?

二进制模式下的Perl6 $*ARGFILES.handles?
EN

Stack Overflow用户
提问于 2018-12-06 03:52:47
回答 2查看 141关注 0票数 7

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

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

代码语言:javascript
复制
#! /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重复repeat2

失败的原因是:在./zip-merge第7行的块中,无法以二进制模式对句柄执行'get‘操作

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

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

perl6 -v:这是乐天2018.10版,构建于MoarVM 2018.10版之上

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

EN

回答 2

Stack Overflow用户

发布于 2018-12-06 13:05:04

关闭.handles返回的IO::Handle对象。

代码语言:javascript
复制
my @*ARGS = 'test.p6';
my @handles = $*ARGFILES.handles;
for @handles { say $_ }
# IO::Handle<"test.p6".IO>(closed)

如果你只是想让你的代码正常工作,在赋值给@handles之后添加下面这行代码。

代码语言:javascript
复制
.open for @handles;

这是因为.handles的迭代器是用IO::CatHandle.next-handle编写的,它打开当前句柄并关闭前一个句柄。

问题是,在你有机会对它们做任何工作之前,它们都有机会同时成为当前句柄和前一个句柄。

(也许.next-handle和/或.handles需要一个:!close参数。)

假设你想让它像roundrobin一样工作,我实际上会写成这样:

代码语言:javascript
复制
# /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之前,您需要对这些值进行逐条列化(.<>)。

代码语言:javascript
复制
for flat roundrobin @line-seqs.map(*.<>) {
  .say
}

实际上,我个人更有可能写一些类似于这个(长)一行的东西。

代码语言:javascript
复制
$*ARGFILES.handles.eager».open».lines.&roundrobin.flat.map: *.put
票数 3
EN

Stack Overflow用户

发布于 2018-12-06 04:01:10

:binalways set in this type of objects。由于您正在处理句柄,因此您应该按照示例中的说明逐行读取,或者重置句柄以使其不处于二进制模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53639771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档