如何将raku-e和-n用于多个文件全局 [英] How do I use raku -e and -n with multiple file glob

查看:14
本文介绍了如何将raku-e和-n用于多个文件全局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在Windows上用Raku执行以下操作

raku -n -e ".say if /mydatabegin/;" *.file

无法打开文件C:..*.File:参数无效

球体不会被解释为球体。我猜这是因为Windows需要你的程序自己来做球化?那么,是否存在我可能遗漏或重定向的预处理指令或函数、甚至开关,或者允许在保持-n(或-p)和-e开关的简单性的同时扩展GLOB的东西?

显然,我可以通过删除-n(或-p)将其更改为完整的程序,只需使用-e指定Main,然后对GLOB结果进行循环。但我真的很喜欢-n。

PS。我真的只是在学习raku,我很惊讶这不是开箱即用的。因此,语法简单的完整程序的例子也适用。但我真的很喜欢-n..

编辑:re@chenyf

raku -e ".say for $*ARGFILES" *.file

相同的错误。相关:

raku -e ".say for $*ARGFILES.lines" *.file

相同错误。

raku -e "use IO::Glob; .say for glob('*.file')"

按预期工作!正在扩展:

raku -e "use IO::Glob; .say for glob('*.file').lines"

‘IO::GLOB’类型的调用没有这样的方法‘LINES’

越来越近--也许在此基础上进行扩展是一个足够好的解决方法。但回到一行荣耀的尝试:

raku -e "use IO::Glob; .say for glob($*ARGFILES)" test.file

无法解析调用方全局(IO::ArgFiles:D);这些签名都不匹配。

好的-让我们回到字符串的安全性:

raku -e "use IO::Glob; .say for glob($*ARGFILES.Str)" test.file

是的!所以..:

raku -e "use IO::Glob; .say for glob($*ARGFILES.Str).lines" test.file

‘IO::GLOB’类型的调用没有这样的方法‘LINES’

我显然需要阅读更多的手册。但让我们退一步,看看我的用例是否有效:

raku -e "use IO::Glob; .say for glob($*ARGFILES.Str)" *.file

无法打开文件C:..*.File:参数无效

与我开始时所犯的错误相同。这会不会只是Windows上的Raku错误?

编辑:

raku -MIO::Glob -e "my @files = (map { glob($_).dir }, @*ARGS).flat; for @files -> $file { say $_ for $file.lines }" *file *file2 *5

我有三套文件。我几乎可以接受这个解决方案--除非出于某些原因,这些行都印有

对缩写和去掉引号有什么想法吗?

编辑解决$*ARGFILES变量的自动匹配问题:

raku -MIO::Glob -n -e "BEGIN { @*ARGS = (map { glob($_) }, @*ARGS).flat }; .say" *.file *.file2

它的优点是看起来仍然像原来的一行;它使用-n!它只需在创建$*ARGFILES时执行似乎是错误的筛选。

raku -MIO::Glob -e "BEGIN { @*ARGS = (map { glob($_) }, @*ARGS).flat }; .say for $*ARGFILES.lines" *.file *.file2

转换为上面的$*ARGFILES行显示$*ARGFILES从@*args动态获取其值。

编辑

最后,它证明GLOB函数不适用于目录,至少在Windows上不适用(documentation有一个根本不适用的示例)。

#Example from https://github.com/zostay/raku-IO-Glob
for glob("src/core/*.pm") -> $file { say ~$file }

#mine that doesn't work
raku -MIO::Glob -e "for glob('..*.file') -> $file { say ~$file }"

#mine that does work.
raku -MIO::Glob -e "for glob('*.file').dir('..') -> $file { say ~$file }"

#And therefore the final modification of the script above:
raku -MIO::Glob -e "BEGIN { @*ARGS = (map { glob(.IO.basename).dir(.IO.dirname) }, @*ARGS).flat };  .say for $*ARGFILES.lines" ..*.file

推荐答案

一般答案--它不是错误。Windows程序必须处理它们自己的全局处理,如果它们想要的话。让它在raku可执行文件中工作对我来说很有意义;它消除了特定于平台的意外,并使一行程序更容易。

但其他人不这么认为,有一个足够简单的解决方案-创建您自己的模块,以便代码可以保持一致,并且调用相对简单。

这里有一个适用于初学者的模块。有空间添加类似

的内容
  • 强制匹配成功的开关
  • 指示失败的全局应保留在@*args变量中的开关
  • 切换到之后仅为GLOB。
  • 应用球形而不是自动应用的例程。这将允许您删除非文件开关
  • 将每个全局收集到其自己的列表中(可能使用开关)。

模块:

unit module CLGlob:ver<1.0>:auth<pureabsolute>;

use IO::Glob;

@*ARGS = map { .Str }, (map { glob(.IO.basename).dir(.IO.dirname) }, @*ARGS ).flat;

注意:当GLOB函数适用于具有目录的窗口时,可以简化第二个映射中的表达式。

注意:我将每个元素转换为.Str以使@*args保持一致。$*ARGFILES无需执行此操作即可工作,因此,如果您再也不查看@*ARG,则可以节省一些处理。

最后,最终结果:

raku -MCLGlob -ne ".say" ..*.file ..*.file2

耶。

这篇关于如何将raku-e和-n用于多个文件全局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆