F#解析命令行参数,在此点或之前期望不完整的结构化构造;要么 ;;

时间:2019-09-07 05:26:50

标签: f# arguments pattern-matching

我有一个模仿F#touch命令的基本F#CLI,我的程序采用文件名,如果文件存在则创建文件,或者如果文件不存在则更新访问时间。

已经完成了核心功能,但是应该在语法上模仿Linux命令Touch。语法应为“ touch file1.text”(用于创建文件)或“ touch --version”(用于在指定选项时要打印的消息)。

我的核心问题是: 1.让我的代码遵循Linux的语法-

当前->>> Test.text =已创建文件。

预期->>>触摸test.txt或

touch --version =已创建文件或打印了触摸命令信息。

  1. 接受--version和--help或类似的有效输入并打印相应的信息。

当前结果

  

test.txt //创建文件   0 //

预期

  

touch test.text //创建文件   0 //   要么   预期   touch --version / touch --help   / *触摸信息   触摸信息   触摸信息   触摸信息* /

尝试使用Argu库,但似乎超出了我当前的范围,目前正在尝试使用参数解析器模块。

// Learn more about F# at http://fsharp.org

open System
open System.IO
open System.Text

type filename = String


let touch path =
   //Console.ReadLine()
    if File.Exists path
    then File.SetLastWriteTime(path, DateTime.Now) 
    else 
         if not(File.Exists path)
         then File.WriteAllText(path, " ")
         Console.ReadKey()|>ignore





[<EntryPoint>]
    let main argv =
        printfn "Touch Command - Built using F#"
        printfn "Please enter the file you want to touch"
        if argv |> Array.contains "Help " then 
               printfn "Display help here"
               exit(0)
               printfn "Version information"
               exit(0)
        for filename in argv do
            touch(filename)
        0    
        // return an integer exit code



     ```

Current result 
> test.txt // File created
> 0 // internal 

Expected
>touch test.text //file created
>0 //internal

or
Expected
>touch --version / touch --help
>/* Touch information
Touch information
Touch information
Touch information*/

No current errors
When argu library attempted, to many errors to bring to solution board.

1 个答案:

答案 0 :(得分:1)

argv是一个字符串数组,因此判断--help--version是否在该数组中的最简单方法是使用Array.contains函数:

[<EntryPoint>]
let main argv =
    printfn "Argv: %A" argv  // Helpful in debugging, remove in final version
    if argv |> Array.contains "--help" then
        printfn "Display help here"
        exit(0)
    if argv |> Array.contains "--version" then
        printfn "Version information"
        exit(0)
    for filename in argv do
        touch(filename)

请注意,此示例假设您重写touch函数以使用filename参数,而不是通过Console.ReadLine从控制台读取文件名。

还要注意,在[<EntryPoint>]之类的属性之后,无需添加第二级缩进。该属性应该与正在修改的let声明在同一级别缩进。因此,您应该在模块的顶层(即缩进为零)编写let main argv =行。