如何在Julia中扩展通配符命令行参数?
shell在到达之前似乎没有展开它们。
如果我将我的脚本称为ComboBox
,我的输出只是julia script.jl *.dat
*.dat
如果我用Java编写等效的程序:
for arg in ARGS
println(arg)
end
并将其命名为public class rejig {
public static void main(String[] args) throws Exception {
for(int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}
,我获得了当前目录中所有DAT文件的列表。
我按照“命令行”,“通配符”等方式搜索并没有让我走得太远。
如何让Julia提供与Java代码相同的输出?
答案 0 :(得分:4)
我在https://github.com/vtjnash/Glob.jl写了一个纯粹的Julia实现Glob(又名fnmatch或通配符命令行扩展),也可以通过Pkg.add("Glob")
获得。
这可以用于与平台无关的通配符扩展,例如*.dat
示例。
答案 1 :(得分:2)
正如评论中所解释的,shell
是扩展通配符的程序。这种扩展称为glob
扩展,标准C库中有一些函数可以执行它(并且shell可能使用它自己)。
实际上,这是一个与标准libc
接口以扩展通配符的示例:
type GlobType
pathc::Int64
names::Ptr{Ptr{UInt8}}
slots::Int64
extra1::Int64
extra2::Int64
end
function parseglob(gb::GlobType)
i=1
res = UTF8String[]
while i<=gb.pathc
p = unsafe_load(gb.names,i)
if p==C_NULL return res ; end
push!(res,bytestring(p))
i+=1
end
res
end
function glob(filepattern::AbstractString)
gb = GlobType(0,C_NULL,0,0,0)
retval = ccall((:glob,"libc"),Cint,
(Ptr{UInt8},Cint,Ptr{Void},Ptr{GlobType}),
filepattern,0,C_NULL,&gb)
res = ( retval==0 ? parseglob(gb) : UTF8String[] )
ccall((:globfree,"libc"),Void,(Ptr{GlobType},),&gb)
res
end
# glob("*.jl") # ["glob.jl"] on my machine
库例程有许多标记和选项,您可能会感兴趣。