{status, body} = File.read("/etc/hosts")
if status == :ok do
hosts = String.split body, "\n"
hosts = Enum.map(hosts, fn(host) -> line_to_host(host) end)
else
IO.puts "error reading: /etc/hosts"
end
我有以下elixir函数,我在其中读取/ etc / hosts文件并尝试使用String.split
逐行拆分。
然后我映射主机的行列表并为每个主机调用line_to_host(host)。 line_to_host方法将行拆分为" "
,然后我想设置from
和to
变量:
def line_to_host(line) do
data = String.split line, " "
from = elem(data, 0) // doesn't work
to = elem(data, 1) // doesn't work either
%Host{from: from, to: to}
end
我查看了stackoverflow,elixir文档并搜索了如何在特定索引处获取列表元素。
我知道有head/tail
但是必须有更好的方法来获取列表元素。
elem(list, index)
正是我所需要的,但不幸的是它不能与String.split
合作。
如何在elixir中按ID获取列表/元组元素
答案 0 :(得分:30)
您可以使用模式匹配:
[from, to] = String.split line, " "
也许你想添加parts: 2
选项,以确保只有两个部分,以防行中有多个空格:
[from, to] = String.split line, " ", parts: 2
还有Enum.at/2
,这可以在这里正常工作,但是是单一的。 Enum.at
的问题在于,由于Elixir中的列表实现,它需要遍历整个列表到请求的索引,因此对于大型列表来说效率非常低。
编辑:这是Enum.at
所请求的示例,但在这种情况下我不会使用它
parts = String.split line, " "
from = Enum.at(parts, 0)
to = Enum.at(parts, 1)