简化嵌套映射解析

问题描述 投票:0回答:1

所以我尝试将此字符串解析为两个整数列表:

69 12 75 19 83 56 73 53 52 91 | 83 63 56 30 77 94 12 81 42 69 52 70  6 97 20 43 61 22 75 19 73 32 74 53 91

这有效:

    [results_s, owned_s] =
      data_string
    |> String.split("|")
    |> Enum.map(&String.trim/1)
    |> Enum.map(&String.split(&1, ~r/\s+/))

    results = results_s
    |> Enum.map(&String.to_integer/1)

    owned = owned_s
    |> Enum.map(&String.to_integer/1)

但我希望避免中间作业的需要。我试过这个:

    [results_s, owned_s] =
      data_string
    |> String.split("|")
    |> Enum.map(&String.trim/1)
    |> Enum.map(&String.split(&1, ~r/\s+/))
    |> Enum.map(&Enum.map(&1, &String.to_integer/1))

但是出现有关嵌套捕获的错误。

还有这个:

    [results_s, owned_s] =
      data_string
    |> String.split("|")
    |> Enum.map(&String.trim/1)
    |> Enum.map(&String.split(&1, ~r/\s+/))
    |> Enum.map(fn (left, right ->
      {
        left |> Enum.map(&String.to_integer/1),
        right |> Enum.map(&String.to_integer/1)
      }
    end)

但出现此错误:

解析:卡1:69 12 75 19 83 56 73 53 52 91 | 83 63 56 30 77 94 12 81 42 69 52 70 6 97 20 43 61 22 75 19 73 32 74 53 91 ** (FunctionClauseError) CardParser.parse_card/1 中的匿名 fn/1 中没有匹配的函数子句

The following arguments were given to anonymous fn/1 in CardParser.parse_card/1:

    # 1
    ["69", "12", "75", "19", "83", "56", "73", "53", "52", "91"]

我是不是想太多了?这怎么办?

elixir
1个回答
0
投票

无法使用嵌套捕获,但嵌套匿名函数仍然有效。

data_string
|> String.split("|")
|> Enum.map(fn e ->
  ~r/\d+/
  |> Regex.scan(e)
  |> List.flatten()
  |> Enum.map(&String.to_integer/1) 
end)

#⇒ [
#    [69, 12, 75, 19, 83, 56, 73, 53, 52, 91],
#    [83, 63, 56, 30, 77, 94, 12, 81, 42, 69, 52, 70, 6, 97, 20, 43, 61, 22, 75,
#     19, 73, 32, 74, 53, 91]
#  ]
© www.soinside.com 2019 - 2024. All rights reserved.