如何将raku-e和-n用于多个文件全局 [英] How do I use raku -e and -n with multiple file glob
问题描述
我想在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屋!