元组列出最多由Erlang中的\ r \ n分隔的多个元素

时间:2014-10-15 05:58:02

标签: list ftp erlang tuples

我正在编写一个获取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分隔),以便我可以单独访问它们(为了将它们保存在一个例如,数据库)。 再次感谢。

3 个答案:

答案 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").