2015-10-20 90 views
3

如何在Julia中扩展通配符命令行参数?Windows上Julia的命令行通配符

shell在它们到达之前似乎没有展开它们。

如果我把我的脚本为julia script.jl *.dat,我的输出就是*.dat

for arg in ARGS 
    println(arg) 
end 

如果我用Java编写的同等功能的程序:

public class rejig { 
    public static void main(String[] args) throws Exception { 
     for(int i = 0; i < args.length; i++) { 
      System.out.println(args[i]); 
     } 
    } 
} 

,并称呼其为java rejig *.dat,我得到的列表所有DAT文件在当前目录中。

我沿着“命令行”,“通配符”的线搜索等还没有得到我很远。

如何让Julia给出与Java代码相同的输出?

+0

这是在Windows上吗?在一个类似unix的系统上,这应该一直工作,因为shell在调用命令之前展开无引号的参数。 Java尝试在Windows上模拟shell通配符行为,请参阅:http://stackoverflow.com/questions/25948706/java-command-line-arguments-stop-expanding-wildcard-symbols 但是,Julia目前没有。 –

+0

它在Windows上。开溜。我知道这是扩展通配符的shell,但我没有意识到DOS不这样做。 – masher

回答

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 

库例程有许多标志和选项,这可能是你的兴趣。

4

我在https://github.com/vtjnash/Glob.jl上写了一个Glob(又名fnmatch或通配符命令行扩展)的pure-Julia实现,它也可以通过Pkg.add("Glob")获得。

这可用于独立于平台的通配符扩展,如您*.dat例子。

+0

这就是我开始写的,然后放弃了为了我想做的事情而做的太多工作。 我会检查出来。 – masher