2014-01-08 33 views
-1

这是我的代码部分有什么不对字符串:令牌

parse1(["$WP",String]) -> 
    io:format(String++"~n"), 
    parse2(string:tokens(String, "=")). 

parse2(["UNCFG"|Command]) -> 
    io:format(Command++"~n"), 
    uncfg(string:tokens(Command, ",")). 

uncfg([Line]) -> 
    io:format("just why "++Line++"~n"); 

uncfg([Password|Device_ID]) -> ... 

所以,一切都很简单,exept一两件事 - 功能字符串:令牌 首先,在parse1功能,它工作正常,例如拆分“UNCFG = 1,2,3”“UNCFG”“1,2,3”

parse2功能没有,没有分裂 和,我得到一个错误 .... gps_tracker,uncfg [[[ “1,2,3”]]] ... exept得到雷[ “1”, “2”, “3”]

我添加

uncfg([Line]) -> ... 

现在,每当我得到我 “只是为什么”

和,真的,为什么,什么时候区别?

我听说过re:拆分,而且,它很适合这种情况。酷 但我真的想知道那里有什么问题。我只是在研究erlang。 我认为这是一个简单的问题。

回答

1

嗯,我一直在shell中运行这些命令:

1> ["UNCFG"|Command] = string:tokens("UNCFG=1,2,3", "="). 
["UNCFG","1,2,3"] 
2> [Line] = string:tokens(Command,","). 
[["1,2,3"]] 
3> io:format("just why "++Line++"~n"). 
just why 1,2,3 

所以它的工作原理是,不要指望。

但是你对parse1/1的论点是什么?


顺便说一句,最后一行,这绝对是

io:format("just why ~s~n",[Line]). 

哎呀,我想我知道你的错误是什么:你认为错误的东西,和列表清单不是一个字符串(一些函数接受深度列表,但不是string:tokens/2)。 Marcelo和Monk_code在某种程度上是正确的,但不是因为很好的原因。

与模式[“UNCFG” |命令],命令中包含列表的整个,并且也是一个列表。所以,你得到这些结果:

1> string:tokens(["1,2,3"],","). 
[["1,2,3"]] 

与模式[“UNCFG”,命令],命令是你的列表中,这似乎是你想要的(或不的第二个元素,你不非常清楚):

1> string:tokens("1,2,3",","). 
["1","2","3"] 

但是这最后的输出将不匹配您的第一个uncfg/1模式。它将与第二个匹配,密码中包含“1”和Device_ID [“2”,“3”],因为您再次匹配列表的尾部。

了解一下自己的一些很好的erlang,特别是pattern matching stuff

+0

哦,太棒了!我不知道它以前是如何工作的,但是,实际上,我有Command = [“1,2,3”],除了“1,2,3”。非常感谢! 加入[]等 'parse2([ “UNCFG” | [命令]) - >' 代替 'parse2([ “UNCFG” |命令) - >' 解决的问题。凉!感谢您的关注! – user3172486

+0

仅供参考:[[“UNCFG”| [Command]]'确实与'[“UNCFG”,Command]相同'' – Berzemus