当前位置: 首页 > 知识库问答 >
问题:

我应该如何处理Perl 6$*无法通过行()读取的ARGFILES?

冉永宁
2023-03-14

我正在玩,它从您在命令行上指定的文件中读取行:

for lines() { put $_ }

如果它不能读取其中一个文件名,它会抛出X::Adhoc(也许有一天它会有更好的异常类型,这样我们就可以用. path方法获取文件名)。好吧,抓住那个:

try {
CATCH { default { put .^name } }
for lines() { put $_ }
}

所以这捕获了X::Ad的错误,但仅此而已。尝试块在这一点上完成。它不能。恢复并尝试下一个文件:

try {
CATCH { default { put .^name; .resume } }  # Nope
for lines() { put $_ }
}

回到Perl5Land,您会收到一条关于错误文件名的警告,程序将继续进行下一步。

如果存在一些参数,我可以先过滤@*ARGS,然后重建$*ARGFILES

$*ARGFILES = IO::CatHandle.new:  
    @*ARGS.grep( { $^a.IO.e and $^a.IO.r } ) if +@*ARGS;

for lines() { put $_ }

尽管它默默地忽略了坏文件,但这种方法仍然有效。我可以处理这个问题,但是我自己处理参数列表有点乏味,包括标准输入文件名的-和没有参数的默认值:

my $code := { put $_ };

@*ARGS = '-' unless +@*ARGS;
for @*ARGS -> $arg {
    given $arg {
        when '-'     { $code.($_) for $*IN.lines(); next }
        when ! .IO.e { note "$_ does not exist";    next }
        when ! .IO.r { note "$_ is not readable";   next }
        default      { $code.($_) for $arg.IO.lines() }
        }
    }

但这需要做很多工作。有没有更简单的方法来处理这个问题?

共有1个答案

乐正瑞
2023-03-14

要在打开不良时发出警告并继续,您可以使用以下内容:

$*ARGFILES does role { method next-handle { loop {
    try return self.IO::CatHandle::next-handle;
    warn "WARNING: $!.message"
}}}

.say for lines

简单地混合在一个角色中,使IO::CatHandle.next方法重新尝试获取下一个句柄。(您也可以使用运算符在副本上混合)。

如果它不能读取其中一个文件名,它会抛出X::Ad

X::AdHoc来自。打开call;要将这些异常类型化,有一个有点发霉的PR,所以一旦修复了它,IO::CatHandle也会抛出类型化异常。

它不能.恢复

是的,您只能从捕获它的CATCH块恢复,但在本例中,它是在中捕获的。打开调用,并进入一个故障,然后由IO::CatHandle接收。下一个句柄及其。异常是重新定义的。抛出。

然而,即使它在这里是可恢复的,它也只是恢复到引发异常的路径中,而不是使用另一个句柄重试。这没用。(我考虑过使其可恢复,但这给开关上的增加了模糊性,我不愿意指定从某些位置恢复异常必须能够有意义地继续,我们目前不为核心中的任何位置提供这样的保证)。

包括-作为标准输入文件名

请注意,这种特殊意义在第6章中消失了。d语言,只要IO::Handle。打开(扩展为IO::CatHandle.new)即可。它可能会在IO::ArgFiles中得到特殊处理,但我还没有看到这样的建议。

回到Perl5Land,您会收到一条关于错误文件名的警告,程序将继续进行下一步。

在Perl 6中,它被实现为一种通用的IO::CatHandle类型,用户可以用它来做任何事情,而不仅仅是文件参数,因此,在默认情况下,警告和继续前进对我来说太过宽松了。

IO::ArgFiles可以是提供这种行为的特殊情况。就个人而言,我反对到处都是特殊外壳的东西,我认为这是Perl 5中最大的缺陷,但是你可以提出一个问题,看看是否有人支持它。

 类似资料:
  • 我想做的是从我用Arudino制作的转速表电路中读取连续的数据流,然后将其输入处理;我已经使用下面的代码成功完成了: 我不确定如何处理数据,以便每当检测到某个值时,处理中都会发生事件。 编辑:有人建议关闭,所以我的问题是调用是一个阻塞调用,这意味着中的指令指针将保持在。指针将调用和,但永远不会到达启动串行端口的线路 建议的解决方案是将这些行移动到的顶部,并将作为的最后一行。我尝试了这个(我下面的代

  • 我有一个部署过程,在这个过程中,我将代码签入git存储库,并通过web钩子在生产服务器上运行部署脚本。在该服务器上,我使用ssh和.pem键连接到git,从git拉出,npm安装,构建webpack并重新启动服务进程。 我从来不打算从prod服务器提交任何东西--它们应该能够自动部署。但是,这不起作用,因为文件在运行时经常更新,因此下次部署时,步骤失败,表示我与现有的文件冲突,因为它有未提交的更改

  • 我有一个Play 2.0.1应用程序,正在通过spring data binder掌握表单处理的窍门,如文档中所述。我有一个表单,假设一个用户给另一个用户发送消息,看起来像这样: 我的自定义绑定器确保用户(由他的id以超文本标记语言-form表示)得到正确的序列化,并且当不存在这样的用户时默认为空。 我正在考虑编写额外的验证,即确保通过表单传递的用户是试图发布消息的用户的朋友。这基本上是一种-注释

  • 我试图在Perl6中逐行读取一个巨大的gz文件。 我正在尝试做这样的事情 但是这会给出一个错误,我有一个格式不正确的UTF-8。我看不到如何从帮助页面读取gzip材料https://docs.perl6.org/language/unicode#UTF8-C8或https://docs.perl6.org/language/io 我想完成和在Perl5中一样的事情:http://blog-en .

  • 问题内容: 我正在学习MySQL并尝试使用子句。当我如下使用它时: 我收到以下错误: MySQL服务器正在使用–secure-file-priv选项运行,因此它无法执行此语句 我该如何解决这个错误? 我已经检查了关于同一错误消息的另一个问题,但仍然找不到解决方案。 我正在使用MySQL 5.6 问题答案: 它按预期工作。您的MySQL服务器已使用--secure-file- priv 选项启动,该

  • 我总是从命令行运行程序,允许你混合参数的顺序。如果你在其中加入额外的东西,他们就会抓住你。例如: 他们是怎么做到的?有这方面的模块吗?