Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 将文件解析为嵌套字典_Elixir - Fatal编程技术网

Elixir 将文件解析为嵌套字典

Elixir 将文件解析为嵌套字典,elixir,Elixir,我有一个配置文件,我想用以下格式读取 [key_1] inner_key_1 inner_entry_1 inner_key_2 inner_entry_2 inner_key_3 inner_entry_3 inner_key_4 inner_entry_4 [key_2] inner_key_5 inner_entry_5 inner_key_6 inner_entry_6 inner_key_7 inner_entry_7 inner_key_8 inner_entry_8 然后会被映射

我有一个配置文件,我想用以下格式读取

[key_1]
inner_key_1 inner_entry_1
inner_key_2 inner_entry_2
inner_key_3 inner_entry_3
inner_key_4 inner_entry_4
[key_2]
inner_key_5 inner_entry_5
inner_key_6 inner_entry_6
inner_key_7 inner_entry_7
inner_key_8 inner_entry_8
然后会被映射到一个嵌套的长生不老药字典中,就像这样

%{key_1 => %{inner_key_1 => inner_entry_1, ... }, key_2 => %{inner_key_5 => inner_entry_5,...}}

我在构思如何使用长生不老药和函数式编程时遇到困难。我曾尝试使用流库来实现这一点,但没有成功。

一个简单的解决方案可能与此类似:

def read_config(file) do
  file
  |> File.stream!()
  |> Stream.map(&String.trim/1)
  |> Enum.reduce({%{}, nil}, &read_config/2)
  |> elem(0)
end

defp read_config("[" <> key, {acc, _top_key}) do
  key = String.trim_trailing(key, "]")
  {Map.put(acc, key, %{}), key}
end
defp read_config(key_value, {acc, top_key}) do
  [key, value] = String.split(key_value, " ")
  {put_in(acc, [top_key, key], value), top_key}
end
def read_config(文件)do
文件
|>File.stream!()
|>Stream.map(&String.trim/1)
|>reduce({%{},nil},&read_config/2)
|>元素(0)
结束
defp read_config(“[”键,{acc,{U top_键})do
key=String.trim_尾部(key,“]”)
{Map.put(acc,key,%{}),key}
结束
defp read_config(key_value,{acc,top_key})do
[key,value]=String.split(key_value,“”)
{put_in(acc,[top_key,key],value),top_key}
结束

在将命令式循环转换为函数式样式时,最常用的是reduce。下一步是确定每个迭代过程中需要的所有状态-在本例中,我们需要“到目前为止的结果”和当前的顶级键-这类似于您在命令式解决方案中作为循环外的可变变量使用的状态。

为什么不允许使用类似
“[“key”]”
,禁止这样使用
运算符的原因是什么。只有二进制匹配的最后一部分可以忽略大小<代码>“foo”条的语法与
相同,因此此限制也适用于此处。在某种程度上,这只是当前实现的一个限制,可以通过Erlang本身的一些工作来解除。