将 Elixir 中的进程 ID (`pid`) 转换为元组或字符串;将 `pid` 解析为其他类型

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

如何将进程 ID

PID
转换为元组或字符串?

例如,假设我有一个名为

my_pid

的 PID
iex(1)> my_pid
#PID<0.1692.0>

如何将 PID ID 转换为元组或字符串以获得其中之一?

{ 0, 1692, 0 }

"0.1692.0"
elixir
3个回答
11
投票

您正在寻找

:erlang.pid_to_list/1
:erlang.list_to_pid/1
功能。

list = self() |> :erlang.pid_to_list()
#⇒ [60, 48, 46, 49, 49, 48, 46, 48, 62]
to_string(list)
#⇒ "<0.110.0>"
list |> List.delete_at(0) |> List.delete_at(-1) |> to_string()
#⇒ "0.110.0"

这种方法的优点是可转换

:erlang.list_to_pid(list)
#⇒ #PID<0.110.0>

6
投票

一步一步:

pid = self()         # gets shells pid e.g. #PID<0.105.0>

a = "#{inspect pid}" # gives the string "#PID<0.105.0>"

b = String.slice a, 5,100 # remove the prefix #PID<
c = String.trim b, ">"    # remove the postfix >
d = String.split c, "."   # create list of strings: ["0", "105", "0"]

e = Enum.map( d ,fn x -> String.to_integer(x) end) # converts to a list of integers
f = Enum.join(e, " ")

结果:

"0 105 0"


0
投票

从 pid 的字符串表示形式获取

pid
(例如
#PID<0.127.0>
)的另一种有用方法如下,它是 Aleksei 解决方案的派生版本。

以下是 iex 会话的片段:

iex(1)> pid = "#PID<0.127.0>" |> String.trim_leading("#PID") |> String.to_charlist |> :erlang.list_to_pid  
#PID<0.127.0>
iex(2)> Process.alive?(pid)
true
© www.soinside.com 2019 - 2024. All rights reserved.