2015-03-08 33 views
0

在OCaml中,我有這樣的一段代碼:如何將Sys.command的輸出作爲OCaml中的字符串?

let s =Sys.command ("minisat test.txt | grep 'SATIS' ");; 

我想利用MINISAT test.txt的輸出| grep「SATIS」,它對字符串s滿意/不滿意。

我得到以下輸出:

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 

回答

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庫或更高級的庫來避免臨時文件欺騙。

+0

謝謝。你能告訴我,我們是否也可以出口時間? – 2015-03-08 21:13:21

+0

「出口時間」是什麼意思? – PatJ 2015-03-08 22:12:41

+0

我希望程序能夠隨時間採取可滿足性的答案 – 2015-03-08 22:14:46

相關問題