我正在编写一个简短的脚本,以读取脚本文件文件夹中的每个文件,并在第一行的最后一行打印最后一个字-指示可执行文件正在运行-ocaml
,例如在usr/bin/ocaml
#use "topfind"
#require "str"
(* fn to print binary file being called from hashbang line of script file *)
let rec myfn (afile) =
print_string (afile^": ");
if (Sys.is_directory afile) then print_endline("This is a directory.");
let ic = (open_in afile) in
if in_channel_length(ic)==0 then print_endline("Zero length file."); exit 0
let line = input_line(ic) in (* error here *)
if (Str.first_chars line 0 = "#") then
let linelist = (Str.split (Str.regexp "/") line) in
let lastword = List.nth linelist ((List.length linelist) - 1) in
print_endline(lastword)
else
print_endline("Not a script file.") ;;
(* to check all files in directory *)
let dir = "." in
let files = Sys.readdir dir in
Array.iter myfn files;;
但是,它给出了以下错误:
File "firstline3.ml", line 13, characters 27-29:
Error: Syntax error
我已尝试用in
替换;
或在此行中没有终结符,但这无济于事。问题是什么,如何解决。感谢您的帮助。
答案 0 :(得分:2)
您在then
表达式周围缺少括号:
if in_channel_length ic =0 then ( print_endline "Zero length file."; exit 0 );
否则,解析器将表达式读取为
(if in_channel_length ic = 0 then print_endline "Zero length file.");
exit 0;
因此退出是无条件的。
请注意,您应避免使用物理等式运算符==
(尤其是在非可变值上),而应使用=
。
编辑:如果要返回,只需添加一个else分支
if in_channel_length ic = 0 then print_endline "Zero length file."
else ....