F#解析命令行参数

时间:2016-06-27 05:51:50

标签: f#

我需要从命令kine(cmd)中获取3个参数我写了以下内容并收到错误:

    $findings= pg_query($connection, "
    insert into tbl_profile_picture(id,name,emp_id)
    values ((SELECT COALESCE( max(id),0)+1 FROM tbl_profile_picture),'$link1','".$_SESSION['id']."')
    ");  

我知道我需要解析参数(3个字符串)。

当我尝试从命令行运行3个文件时我得到的错误:索引超出了数组的范围......

有人可以帮我吗??

由于

2 个答案:

答案 0 :(得分:7)

从您粘贴的命令行中,您似乎忘记在命令行的第二条和第三条路径之间添加空格 - 您有两个""紧挨着彼此。您还应该注意到,在打印出第一个参数args.[0]时,您会看到由单个"连接的两个路径

至于使代码更健壮:无论语言是什么,访问数组元素而不首先检查数组的长度是一个坏主意。通过数组模式匹配,F#为您提供了一次完成长度检查和元素访问的好方法:

match args with
| [| xmlP; excelFormatP; excelP |] ->
    let result = functionParseXmlToExcel(xmlP , excelFormatP , excelP)
    printfn "Completed with %A" result
    0
| _ -> 
    failwithf "Expected 3 commandline arguments, but got %i arguments" args.Length

我强烈建议您阅读pattern matching in general - Scott正确地将其称为“F#的主力”。

答案 1 :(得分:2)

您需要确定传递的参数数量,以及实际解析它们的方式,以及您调用的函数如何接收它们。因此,显示functionParseXmlToExcel的函数签名也是一个好主意。请参阅下面的一个非常简单的示例:

let myExcelFunction(param1,param2,param3) =
    printfn "%A" param1
    printfn "%A" param2
    printfn "%A" param3


[<EntryPoint>]
let main argv = 
    printfn "%A" argv

    let parseParams (argv:string []) =
        let param1,param2,param3 = argv.[0],argv.[1],argv.[2]
        myExcelFunction(param1,param2,param3)

    match argv.Length with
        | 3 -> parseParams argv |> ignore
        | _ ->  failwith "You need to pass three parameters!" 
    0 // return an integer exit code

要获得更完整的解决方案,您可以调查Argu