You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

简化嵌套字符串解析:Elixir实现字符串转两个整数列表

问题描述

我尝试将以下格式的字符串解析为两个整数列表:

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)

错误信息如下:

解析:Card 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) 无匹配的匿名fn/1函数子句在CardParser.parse_card/1中

传递给CardParser.parse_card/1中匿名fn/1的参数为:

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

请问该如何实现无中间变量的解析?


解决方案

要实现无中间变量的解析,可将字符串分割、转换的逻辑合并到同一个管道中,直接将分割后的每一组字符串列表转换成整数列表,再解构赋值给两个变量。

正确写法如下:

[results, owned] =
  data_string
  |> String.split("|")
  |> Enum.map(fn part ->
    part
    |> String.trim()
    |> String.split(~r/\s+/)
    |> Enum.map(&String.to_integer/1)
  end)

错误原因解释

  1. 第一种写法的问题:Elixir 不支持嵌套的捕获符号 & 写法,&Enum.map(&1, &String.to_integer/1) 无法被正确解析,必须显式使用匿名函数拆分逻辑。
  2. 第二种写法的问题:Enum.map 接收的匿名函数仅能接受一个参数,但你定义了接收两个参数的函数 fn (left, right -> ...),而 Enum.map 每次迭代只会传入分割后的单个字符串列表,导致函数子句匹配失败。

内容的提问来源于stack exchange,提问作者ScottishTapWater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:06:02