按其注册名中的子串搜索过程

问题描述

在 elixir 中,我可以使用其注册名称获取进程列表

for pid <- Process.list,do: {pid,Process.info(pid,:registered_name)}
[
  {#PID<0.0.0>,{:registered_name,:init}},{#PID<0.1.0>,:erts_code_purger}},...

如何只获取寄存器名称中带有子字符串的进程?

示例:仅获取其寄存器名称中包含子字符串 MyApp 的进程。

解决方法

最好用 Enum.reduce/3 一次性完成

Enum.reduce(Process.list(),[],fn(pid),acc ->
  with {:registered_name,name} = reg_name <- Process.info(pid,:registered_name),true <- name |> to_string() |> String.contains?("proxy"),do: [reg_name | acc],else: (_ -> acc)
end)
,
Process.list
|> Enum.filter(fn(pid) ->
  {:registered_name,name} = Process.info(pid,:registered_name)
  to_string(name) =~ "MyApp"
end)
|> Enum.map(fn pid -> Process.info(pid,:registered_name) end)