我正在编写一个获取FTP服务器文件列表的程序。 所以它就是这样开始的:
inet_parse:address(IP),
inets:start(),
{ok, Pid} = inets:start(ftpc, [{host, IP}]),
ftp:user(Pid, "anonymous", "lol@lol.com"),
ftp:pwd(Pid),
Content = ftp:ls(Pid),
Content变量是一个元组,并返回类似的内容:
7> Content = ftp:ls(Pid).
{ok,"-rw-r--r-- 1 21 21 0 Oct 14 21:47 bar\r\ndrwxr-xr-x 2 21 21 4096 Oct 14 21:47 baz\r\n-rw-r--r-- 1 21 21 0 Oct 14 21:47 foo\r\nlrwxrwxrwx 1 1000 10 21 Sep 10 14:22 musique -> /home/foo/musique\r\n"}
我知道我可以将这个元组转换为列表,但我想知道我是否可以获取每个元素(由\ r \ n分隔),以便我可以单独访问它们(为了将它们保存在一个例如,数据库)。 再次感谢。
答案 0 :(得分:2)
1> {ok,S} = {ok,"-rw-r--r-- 1 21 21 0 Oct 14 21:47 bar\r\ndrwxr-xr-x 2 21 21 4096 Oct 14 21:47 baz\r\n-rw-r--r-- 1 21 21 0 Oct 14 21:47 foo\r\nlrwxrwxrwx 1 1000 10 21 Sep 10 14:22 musique -> /home/foo/musique\r\n"}.
{ok,"-rw-r--r-- 1 21 21 0 Oct 14 21:47 bar\r\ndrwxr-xr-x 2 21 21 4096 Oct 14 21:47 baz\r\n-rw-r--r-- 1 21 21 0 Oct 14 21:47 foo\r\nlrwxrwxrwx 1 1000 10 21 Sep 10 14:22 musique -> /home/foo/musique\r\n"}
2> Split = string:tokens(S,"\r\n").
["-rw-r--r-- 1 21 21 0 Oct 14 21:47 bar",
"drwxr-xr-x 2 21 21 4096 Oct 14 21:47 baz",
"-rw-r--r-- 1 21 21 0 Oct 14 21:47 foo",
"lrwxrwxrwx 1 1000 10 21 Sep 10 14:22 musique -> /home/foo/musique"]
3>
答案 1 :(得分:2)
有一个函数字符串:tokens / 2,但是它将字符串作为分隔符列表,因此字符串的每个字符都是一个分隔符。调用
string:tokens(Content, "\r\n")
适用于您的情况,但一般情况下并不完全符合您的要求。下面是一个函数示例,它将字符串(多字符)作为分隔符:
tokens(Str, Separator) ->
tokens(Str, Separator, []).
tokens(Str, Separator, Acc) ->
case string:str(Str, Separator) of
0 ->
lists:reverse([Str | Acc]);
N ->
Token = string:substr(Str, 1, N-1),
Str1 = string:substr(Str, N + string:len(Separator)),
tokens(Str1, Separator, [Token | Acc])
end.
答案 2 :(得分:0)
{ok, Content} = ftp:ls(Pid),
string:tokens(Content, "\r\n").