【问题标题】:Pattern matching with string in Erlang. Variable in left positionErlang 中字符串的模式匹配。左侧位置变量
【发布时间】:2015-09-16 07:02:45
【问题描述】:

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

"kapa" ++ D = "kapagama". % D now has a value "gama"

有没有办法把“变量”放在左边?类似的东西

D ++ "gama" = "anyLengthStringgama".

对于这个表达式,shell 返回一个错误:

* 1: illegal pattern

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

【问题讨论】:

    标签: erlang pattern-matching


    【解决方案1】:

    为此,您应该使用regular expression matching,或使用几个列表反转:

    1> "amag" ++ D = lists:reverse("anyLengthStringgama").
    "amaggnirtShtgneLyna"
    2> lists:reverse(D).
    "anyLengthString"
    

    【讨论】:

      【解决方案2】:
      "kapa" ++ D = "kapagama".
      

      只是

      的语法糖
      [$k, $a, $p, $a | D] = "kapagama".
      

      这只是语法糖

      [$k|[$a|[$p|[$a|D]]]] = "kapagama".
      

      这段代码没有对应的:

      D ++ "gama" = "kapagama".
      

      这可以作为语法糖。所以正如史蒂夫维诺斯基所写,你必须使用lists:reverse/1

      "amag" ++ D = lists:reverse("kapagama"), lists:reverse(D).
      

      或使用re 模块。

      【讨论】:

      • 这是因为模式匹配不能搜索,它只能匹配显式模式。 D ++ "gama" 基本上是说向下搜索字符串,直到最后找到 "gama" 然后返回它之前的所有内容,这不起作用。
      • @rvirding 可以定义这样的运算符吗?我的意思是搜索驱动的模式?可能不在 Erlang 中?
      • @NaderGhanbari 不,您不能定义自己的运算符。您无法匹配 D ++ gama 的原因是需要搜索以找到结尾然后检查。模式匹配只是直接匹配。
      猜你喜欢
      • 2011-08-14
      • 2013-08-15
      • 2012-06-13
      • 2011-01-02
      • 2020-04-06
      • 2015-05-29
      • 2020-04-23
      • 2018-01-18
      • 2015-02-19
      相关资源
      最近更新 更多