Windows上的Julia命令行通配符

时间:2015-10-20 04:13:11

标签: command-line-arguments julia

如何在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代码相同的输出?

2 个答案:

答案 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

库例程有许多标记和选项,您可能会感兴趣。