我试图使用split_string / 4谓词将字符串转换为字符串列表。我希望每个换行符分隔字符串。这就是我的代码
main(Argv) :-
[InputFilename|OutputFileName] = Argv,
read_file_to_string(InputFilename, InputFileString,[]),
split_string(InputFileString,"\n", "\n", InputFileList),
write(InputFileList).
但它没有向控制台写任何东西。但是,如果我把
write(InputFileString)
它打印文件的内容就好了。我在这做错了什么?
main(Input_filename,Output_filename) :-
read_file_to_string(Input_filename, Input_string,[]),
split_string(Input_string,"\n", "\n", Input_list),
write(Input_list).
示例输入文件C:/input_data.txt
Line one
Line two
Line three
示例运行
?- main('C:/input_data.txt','C:/output_data.txt').
[Line one,Line two,Line three]
true.
你在|
中使用[InputFilename|OutputFileName]
是为了分离列表的头部和尾部。使用,
传递两个参数的简单改变就是所需要的,例如, main(Input_filename,Output_filename)
。
这个答案也将变量名称的样式改为snake case,这是Prolog的惯例。
如果你的Argv
是一个包含两个或更多元素的列表,它不会与[InputFilename|OutputFileName]
统一,因为这不是一个包含两个元素的列表。
看到:
$ swipl -q
?- [a,b] = [X|Y].
X = a,
Y = [b].
?- [a,b] = [X|Y], X = a, Y = b.
false.
如果您知道列表中只有2个元素,则可以使用[X, Y]
。如果您的列表可以包含2个或更多元素,则可以使用[X, Y|_]
。这里:
?- [X,Y] = [a,b].
X = a,
Y = b.
?- [X,Y] = [a,b,c].
false.
?- [X,Y|_] = [a,b].
X = a,
Y = b.
?- [X,Y|_] = [a,b,c].
X = a,
Y = b.
?- [X,Y|_] = [a].
false.