【发布时间】:2021-11-21 20:30:53
【问题描述】:
我想在 Windows 上的 raku 中执行以下操作
raku -n -e ".say if /mydatabegin/;" *.file
打开文件 C:\..\*.file 失败:参数无效
glob 不会被解释为 glob。我认为那是因为 Windows 要求您的程序自己进行 globbing?那么是否有预处理指令或函数,甚至是我可能错过或重定向的开关,或者允许扩展 glob 同时保持 -n(或 -p)和 -e 开关的简单性的东西?
显然,我可以通过删除 -n(或 -p)将其更改为完整程序,只需使用 -e 指定一个主程序,然后在 glob 结果上循环。但我真的很喜欢-n。
PS。我实际上只是在学习 raku,很惊讶这不是开箱即用的。因此,具有简单语法的完整程序示例也可以工作。但我真的很喜欢 -n..
编辑:回复@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
无法解析调用方 glob(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
我有三组文件。我几乎可以接受这个解决方案 - 除了出于某种原因这些行被打印为“s
关于缩短和去掉引号的任何想法?
编辑解决 $*ARGFILES 变量的自动通配问题:
raku -MIO::Glob -n -e "BEGIN { @*ARGS = (map { glob($_) }, @*ARGS).flat }; .say" *.file *.file2
这样做的好处是看起来仍然像原来的一个班轮;它使用-n!在创建 $*ARGFILES 时,它只需要执行似乎是错误的 globbing。
raku -MIO::Glob -e "BEGIN { @*ARGS = (map { glob($_) }, @*ARGS).flat }; .say for $*ARGFILES.lines" *.file *.file2
转换为上面的 $*ARGFILES.lines 表明 $*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
【问题讨论】:
-
也许
$*ARGFILES有帮助,例如:andrewshitov.com/2018/12/24/… -
编辑了答案以显示使用 $*ARGFILES 进行测试。
-
顺便说一句,感谢 chenyf 的链接 - 我确实检查了它,他的例子刻意避免了多个文件,更不用说 globbing。我确实在 cmets 中留下了一个问题。
-
raku -e '$*ARGFILES.lines.say;' *.txt和raku -e '.say for $*ARGFILES.lines;' *.txt在我的旧 MacOS 系统上工作。第一个单行在一行中返回每个*.txt文件,第二个单行返回与cat无法区分的逐行返回(每个从我的当前目录返回五个*.txtfiles)。 -
可能是 Window 的(目录)权限错误?还是指定的文件路径不正确?代码
raku -ne ".say if /mydatabegin/;" *.txt在这里工作正常(注意初始.点)。
标签: command-line-arguments glob raku command-line-tool