Erlang 列表匹配(最后N个字符匹配)

Erlang 列表匹配(最后N个字符匹配),erlang,match,Erlang,Match,我现在正在写hg(mercurial)的客户。对于tags命令,响应如下所示: t = [] for line in out.splitlines(): taglocal = line.endswith(' local') if taglocal: line = line[:-6] name, rev = line.rsplit(' ', 1) rev, node = rev.split(':

我现在正在写hg(mercurial)的客户。对于tags命令,响应如下所示:

    t = []
    for line in out.splitlines():
        taglocal = line.endswith(' local')
        if taglocal:
            line = line[:-6]
        name, rev = line.rsplit(' ', 1)
        rev, node = rev.split(':')
        t.append((name.rstrip(), int(rev), node, taglocal))
    return t
process_tags(List)->
    List_b = binary:split(List,<<$\n>>,[global]),
    Result = process_tags(List_b,[]),
    %% error_logger:info_report([client_process_tags,Result]),
    Result.

process_tags([],Result)->
    lists:reverse(Result);

process_tags([<<>>],Result)->
    lists:reverse(Result);

process_tags([Line|Rest],Result) ->
    B = binary_to_list(Line),
    A = process_tags_line(B),
    process_tags(Rest,[A|Result]).

process_tags_line(List) -> 
    %% error_logger:info_report([client_tags_line_1,List]),
    case lists:suffix(" local",List) of
        true ->
            New_list = lists:sublist(List,1,length(List)-7);
        _ ->
            New_list = List
    end,
    {Name,Part2} = rsplit(New_list,$\s),
    {Rev,Node} = 
        rsplit(Part2,$:),
    Rev_a =  string:substr(Rev,1,length(Rev)-1),
    {love_misc:trim(Name),love_misc:to_integer(Rev_a),Node,New_list}.

rsplit(A,Char)->
    Index = string:rchr(A,Char),
    lists:split(Index,A).
>

python的相关代码如下所示:

    t = []
    for line in out.splitlines():
        taglocal = line.endswith(' local')
        if taglocal:
            line = line[:-6]
        name, rev = line.rsplit(' ', 1)
        rev, node = rev.split(':')
        t.append((name.rstrip(), int(rev), node, taglocal))
    return t
process_tags(List)->
    List_b = binary:split(List,<<$\n>>,[global]),
    Result = process_tags(List_b,[]),
    %% error_logger:info_report([client_process_tags,Result]),
    Result.

process_tags([],Result)->
    lists:reverse(Result);

process_tags([<<>>],Result)->
    lists:reverse(Result);

process_tags([Line|Rest],Result) ->
    B = binary_to_list(Line),
    A = process_tags_line(B),
    process_tags(Rest,[A|Result]).

process_tags_line(List) -> 
    %% error_logger:info_report([client_tags_line_1,List]),
    case lists:suffix(" local",List) of
        true ->
            New_list = lists:sublist(List,1,length(List)-7);
        _ ->
            New_list = List
    end,
    {Name,Part2} = rsplit(New_list,$\s),
    {Rev,Node} = 
        rsplit(Part2,$:),
    Rev_a =  string:substr(Rev,1,length(Rev)-1),
    {love_misc:trim(Name),love_misc:to_integer(Rev_a),Node,New_list}.

rsplit(A,Char)->
    Index = string:rchr(A,Char),
    lists:split(Index,A).
我必须检查everyline的“local”后缀,但编译器给出了语法错误。如何正确而优雅地书写。 错误消息:

src/emercurial_client.erl:763: illegal pattern
代码

process\u标签(列表)->
进程标签(列表,[])。
过程标签([],结果)->
列表:反向(结果);
过程标记([Line | Rest],Result)->
B=二进制到二进制列表(第行),
A=工艺标签线(B),
过程标记(Rest[A | Result])。
进程标签行(新列表++“本地”)->%%
%%病人名单
%%数据++“本地”->%%
%%新列表=列表
%%完,,
[Name,Part2]=字符串:标记(数据“”),
[Rev,Node]=string:tokens(第2部分,“:”),
{trim(Name),love_misc:to_integer(Rev),
节点,新的_列表}。
修改后如下:

    t = []
    for line in out.splitlines():
        taglocal = line.endswith(' local')
        if taglocal:
            line = line[:-6]
        name, rev = line.rsplit(' ', 1)
        rev, node = rev.split(':')
        t.append((name.rstrip(), int(rev), node, taglocal))
    return t
process_tags(List)->
    List_b = binary:split(List,<<$\n>>,[global]),
    Result = process_tags(List_b,[]),
    %% error_logger:info_report([client_process_tags,Result]),
    Result.

process_tags([],Result)->
    lists:reverse(Result);

process_tags([<<>>],Result)->
    lists:reverse(Result);

process_tags([Line|Rest],Result) ->
    B = binary_to_list(Line),
    A = process_tags_line(B),
    process_tags(Rest,[A|Result]).

process_tags_line(List) -> 
    %% error_logger:info_report([client_tags_line_1,List]),
    case lists:suffix(" local",List) of
        true ->
            New_list = lists:sublist(List,1,length(List)-7);
        _ ->
            New_list = List
    end,
    {Name,Part2} = rsplit(New_list,$\s),
    {Rev,Node} = 
        rsplit(Part2,$:),
    Rev_a =  string:substr(Rev,1,length(Rev)-1),
    {love_misc:trim(Name),love_misc:to_integer(Rev_a),Node,New_list}.

rsplit(A,Char)->
    Index = string:rchr(A,Char),
    lists:split(Index,A).
process\u标签(列表)->
List_b=二进制:拆分(List,,[global]),
结果=过程标签(列表b,[]),
%%错误\u记录器:信息报告([客户端\u进程\u标记,结果]),
结果。
过程标签([],结果)->
列表:反向(结果);
过程标签([],结果)->
列表:反向(结果);
过程标记([Line | Rest],Result)->
B=二进制到二进制列表(第行),
A=工艺标签线(B),
过程标记(Rest[A | Result])。
流程标签行(列表)->
%%错误日志记录程序:信息报告([客户端标签行1,列表],
案例列表:后缀(“本地”,列表)
正确->
新列表=列表:子列表(列表,1,长度(列表)-7);
_ ->
新列表=列表
完,,
{Name,Part2}=rsplit(新列表,$\s),
{Rev,Node}=
rsplit(第二部分,$:),
Rev_a=字符串:substr(Rev,1,长度(Rev)-1),
{love_misc:trim(Name),love_misc:to_integer(Rev_a),Node,New_list}。
rsplit(A,Char)->
索引=字符串:rchr(A,Char),
列表:拆分(索引,A)。

我认为您不能使用这种模式匹配,因为列表的底层结构([a |[B |[…]B |[…])

相反,你可以这样做

process_tags_line(List) ->
    process_tags_line_1(lists:reverse(List)).
process_tags_line1(" lacol"++L) -> process_tags_line1(L);
process_tags_line1(L) ->
    New_list = lists:reverse(L),
    [Name,Part2] = string:tokens(Data," "),
    [Rev,Node] = string:tokens(Part2,":"),
    {trim(Name),love_misc:to_integer(Rev),node,New_list}.

但是最简单的事情可能是使用列表:后缀(L1,L2).

我认为您不能使用这种模式匹配,因为列表的底层结构([a |[B |[…]|[…])

相反,你可以这样做

process_tags_line(List) ->
    process_tags_line_1(lists:reverse(List)).
process_tags_line1(" lacol"++L) -> process_tags_line1(L);
process_tags_line1(L) ->
    New_list = lists:reverse(L),
    [Name,Part2] = string:tokens(Data," "),
    [Rev,Node] = string:tokens(Part2,":"),
    {trim(Name),love_misc:to_integer(Rev),node,New_list}.

但最简单的事情可能是使用列表:后缀(L1,L2).

正如文档中所指出的,您可以(实际上只是一个语法糖)

我建议您使用函数

因此,您可以通过以下方式重写代码:

New_list = 
    case lists:suffix(" local", List) of
        true ->
            Data;
        false ->
            List
    end

请注意,
case
表达式返回值,因此您只能绑定变量
New_List
一次-使用
case
表达式的结果,而不是像文档中指出的那样绑定在
case
表达式的每个分支中,您可以(实际上只是一个语法糖)

我建议您使用函数

因此,您可以通过以下方式重写代码:

New_list = 
    case lists:suffix(" local", List) of
        true ->
            Data;
        false ->
            List
    end
请注意,
case
表达式返回值,因此您只能绑定变量
New\u List
一次-使用
case
表达式的结果,而不是在
case
表达式的每个分支中绑定