В вашем случае виновником является не ваш код OCaml, а поведение вашей оболочки, например, bash. При вводе текста в командной строке bash многие символы имеют особое значение, например, "
, '
, $
, \
и т. Д. Чтобы обозначить sh специальное значение символа в bash, вы можете либо экранировать его с помощью обратного знака sh, например, \$
, \\
, \'
, либо разделить одинарными кавычками (но вы все равно необходимо избегать одинарных кавычек в тексте, разделенном одинарными кавычками.
Общий подход заключается в том, что когда ваш ввод представляет собой фактический текст или данные, а не последовательность команд и опций, вы должны читать ввод из файла или из стандартного входного канала. Это также помогает, когда размер ввода велик, так как большинство оболочек ограничивают (иногда значительно) общее количество символов, которое может быть передано через командную строку. В ванильном OCaml вы можете введите весь файл в одну строку, используя следующий простой код
let read_file filename =
let buf = Buffer.create 4096 in
let chan = open_in filename in
begin
try while true do Buffer.add_channel buf chan 4096 done
with End_of_file -> ()
end;
Buffer.contents buf
Тогда вам не нужно иметь дело с какими-либо специальными символами, так как ваш ввод будет файлом, и никакая оболочка между ними не будет интерпретации. Вы даже можете анализировать двоичные данные с этим.