【问题标题】:Erlang - ** exception error: no match of right hand side valueErlang - **异常错误:右侧值不匹配
【发布时间】:2015-12-06 21:40:41
【问题描述】:

我对 json 格式字符串的模式匹配有疑问。 在这里我添加了一个简短的版本(只是将长 json 字符串更改为 "{\"jsondata\"}" 所以我有这个成功的模式匹配:

 > MyData2={ok,{{"HTTP/1.1",200,"OK"},
         [{"connection","Keep-Alive"},
          {"date","Thu, 10 Sep 2015 12:03:49 GMT"},
          {"server","Apache/2.4.7 (Ubuntu)"},
          {"vary","X-Auth-Token"},
          {"content-length","1171"},
          {"content-type","application/json"},
          {"x-openstack-request-id",
           "req-31b4efc1-2af4-4130-b7a8-01d94b456096"},
          {"keep-alive","timeout=5, max=100"}],
         "{\"jsondata\"}"}}.

之后我运行以下命令:

> {ok,{{"HTTP/1.1",ReturnCode, State},B,J}}=MyData2.

不幸的是我明白了 如果我将"{\"jsondata\"}" 更改为"jsondata",则最后一个模式匹配工作正常 我不知道如何提取 json 并在 J 中获取 "{\"jsondata\"}" 我会接受任何想法 ** 异常错误:右侧值不匹配

【问题讨论】:

  • 您似乎收到此错误,因为MyData2 已绑定在外壳中。有关该问题的更多信息,请参阅this answer
  • @legoscia - 不,这是一个新的,没有绑定
  • 变量ReturnCodeStateBJ 是否已经绑定?这会导致类似的问题,因为它们将被左侧的绑定值替换。
  • 如果我复制粘贴所有内容并在新的 shell 中执行它,匹配就完美了。它必须是一个变量绑定问题,就像我刚刚发布的那样......
  • 与@maze-le 的结果相同:将所有内容复制并粘贴到新的外壳中,它工作正常。另外,请考虑一下:获得错误消息“右侧值不匹配”的唯一方法是左侧的某些内容已经具有与右侧不匹配的值.. .

标签: json erlang pattern-matching


【解决方案1】:

您的模式匹配操作运行良好。我认为问题在于,ReturnCodeStateBJ 变量之一已经绑定。

假设变量J 已经绑定到一个值,而其他变量没有。根据这个值,模式匹配操作

{ok,{{"HTTP/1.1",ReturnCode, State},B,J}} = MyData2.

成功与否。

案例1J已经绑定到"{\"jsondata\"}"

您的模式匹配将成功,并且将根据MyData2 的模式设置未绑定变量(ReturnCodeStateB)的值。

案例2J已经绑定到"{jsondata}"

右侧的 J 变量与左侧的 MyData2 模式不匹配。因此执行失败并出现异常。

如果您忘记使用 f(Variable) 清除变量,shell 也会发生这种情况。

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 2014-02-06
    • 2016-05-05
    • 1970-01-01
    • 2020-10-08
    • 2016-02-16
    • 2014-06-27
    • 2014-04-12
    • 2021-04-03
    相关资源
    最近更新 更多