在Erlang中与字符串匹配的模式.左侧可变

kha*_*iuk 9 erlang pattern-matching

使用Erlang我可以做这样的事情:

"kapa" ++ D = "kapagama". % D now has a value "gama"
Run Code Online (Sandbox Code Playgroud)

有没有办法将"变量"置于左侧位置?就像是

D ++ "gama" = "anyLengthStringgama".
Run Code Online (Sandbox Code Playgroud)

对于此表达式,shell返回错误:

* 1: illegal pattern
Run Code Online (Sandbox Code Playgroud)

奖金问题:有人可以解释为什么它不起作用?它背后的逻辑是什么?

Hyn*_*dil 14

"kapa" ++ D = "kapagama".
Run Code Online (Sandbox Code Playgroud)

只是语法糖

[$k, $a, $p, $a | D] = "kapagama".
Run Code Online (Sandbox Code Playgroud)

这只是语法糖

[$k|[$a|[$p|[$a|D]]]] = "kapagama".
Run Code Online (Sandbox Code Playgroud)

此代码没有任何对应物:

D ++ "gama" = "kapagama".
Run Code Online (Sandbox Code Playgroud)

这可能是语法糖.所以史蒂夫维诺斯基写道,你必须使用lists:reverse/1

"amag" ++ D = lists:reverse("kapagama"), lists:reverse(D).
Run Code Online (Sandbox Code Playgroud)

或使用re模块.

  • 这样做的原因是模式匹配不能**搜索**,它只能匹配显式模式.`D ++"gama"`基本上是在字符串中搜索,直到你找到一个"gama"`然后返回它之前的一切,这是行不通的. (4认同)

Ste*_*ski 7

为此,您应该使用正则表达式匹配,或使用几个列表反转:

1> "amag" ++ D = lists:reverse("anyLengthStringgama").
"amaggnirtShtgneLyna"
2> lists:reverse(D).
"anyLengthString"
Run Code Online (Sandbox Code Playgroud)