首先,让我们尽早建立这一点,您需要了解您认为需要此功能的原因。也许你有充分的理由——但这对我来说很像 XY 问题。
[编辑:我刚刚看到史蒂夫的帖子为此使用了侦察库。如果您碰巧正在使用侦察,那是一种很棒的方法。如果没有...去了解侦察。它非常好。下面的解决方案是如果你从头开始做事。]
也就是说,让我们看看我们能做什么,因为我们只需要erlang:port_to_list/1
使用(我知道)。
考虑类似的事情:
-module(porter).
-export([port/2]).
-spec port(non_neg_integer(), non_neg_integer()) -> undefined | port().
port(A, B) ->
PortString = lists:flatten(io_lib:format("#Port<~w.~w>", [A, B])),
CheckPort = fun(Z) -> PortString == erlang:port_to_list(Z) end,
case lists:filter(CheckPort, erlang:ports()) of
[] -> undefined;
[P] -> P
end.
在外壳中:
1> c(porter).
{ok,porter}
2> erlang:ports().
[#Port<0.0>,#Port<0.318>,#Port<0.328>,#Port<0.337>]
3> porter:port(0, 328).
#Port<0.328>
4> porter:port(0, 400).
undefined
这可能会或可能不会达到您的目的......但再次考虑一下您为什么需要它。如果您需要手动操作它们,那么在您的项目中添加一个实用程序函数来跟踪您实际打开的端口可能会更加明智。