在OCaml中,我有这段代码:
let s =Sys.command ("minisat test.txt | grep 'SATIS' ");;
我想获取minisat test.txt的输出grep" SATIS" ,这是对字符串s的SATISFIABLE / UNSATISFIABLE。
我得到以下输出:
SATISFIABLE
val s : int = 0
那么,如何将此命令的输出变为字符串。
另外,甚至可以导入时间吗?
这是我在终端
中尝试minisat test.txt
时得到的输出
WARNING: for repeatability, setting FPU to use double precision
============================[ Problem Statistics ]=============================
| |
| Number of variables: 5 |
| Number of clauses: 3 |
| Parse time: 0.00 s |
| Eliminated clauses: 0.00 Mb |
| Simplification time: 0.00 s |
| |
============================[ Search Statistics ]==============================
| Conflicts | ORIGINAL | LEARNT | Progress |
| | Vars Clauses Literals | Limit Clauses Lit/Cl | |
===============================================================================
===============================================================================
restarts : 1
conflicts : 0 (-nan /sec)
decisions : 1 (0.00 % random) (inf /sec)
propagations : 0 (-nan /sec)
conflict literals : 0 (-nan % deleted)
Memory used : 8.00 MB
CPU time : 0 s
SATISFIABLE
答案 0 :(得分:2)
如果您只使用Sys,则无法使用
但是,您可以创建一个临时文件(请参阅Filename
模块的文档here)并告诉命令输出:
let string_of_command () =
let tmp_file = Filename.temp_file "" ".txt" in
let _ = Sys.command @@ "minisat test.txt | grep 'SATIS' >" ^ tmp_file in
let chan = open_in tmp_file in
let s = input_line chan in
close_in chan;
s
请注意,此功能很糟糕:您必须正确处理可能发生的错误。无论如何,你可以根据自己的需要调整它。
您可以使用Unix
库或更高级的库来避免临时文件技巧。
答案 1 :(得分:2)
如果要捕获输出,则必须使用Unix.open_process_in
或Unix.create_process
。
或者更好地使用更高级别的包装器,如'shell'(来自ocamlnet): http://projects.camlcity.org/projects/dl/ocamlnet-4.0.2/doc/html-main/Shell_intro.html
但是我不会把它传递给grep(不是便携式的)。使用OCAML中最喜欢的正则表达式库解析输出。