Macros Erlang:读取环境变量并将其分配给常量

Macros Erlang:读取环境变量并将其分配给常量,macros,erlang,environment-variables,constants,Macros,Erlang,Environment Variables,Constants,我想测试一个应用程序,并决定使用环境变量将配置参数传递给我的erlang应用程序。 目前,我将它们作为带有-define(PARAMETER1,os:getenv(“PARAMETER1”))的宏来阅读。 但是,在这个实现中,每次调用都会读取变量(我不确定这个调用的性能) 启动应用程序时,是否有一种只读取一次环境变量的方法?define是一个宏,因此每次使用宏时,宏中的内容都会放在实际代码中。只需在函数中调用一次os:getenv/1,将其存储在状态中,并将其传递给需要该环境变量的监控器和其他模

我想测试一个应用程序,并决定使用环境变量将配置参数传递给我的erlang应用程序。 目前,我将它们作为带有
-define(PARAMETER1,os:getenv(“PARAMETER1”))的宏来阅读。

但是,在这个实现中,每次调用都会读取变量(我不确定这个调用的性能)


启动应用程序时,是否有一种只读取一次环境变量的方法?

define
是一个宏,因此每次使用宏时,宏中的内容都会放在实际代码中。只需在函数中调用一次
os:getenv/1
,将其存储在状态中,并将其传递给需要该环境变量的监控器和其他模块:


在本例中,配置在
get\u cfg/0
中读取一次,然后传递给主管,主管会将其传递给受监管的工作人员。

用于读取一次并传递给工作人员。但是如何获取这些信息呢?如何存储它们以便于访问,而无需将它们从一个函数传递到另一个函数。我正在编写一个应用程序,其中我正在侦听原始套接字,每当数据包到达时,我都需要在os VAR中配置的信息。您可以将读取值存储在ETS中,可以从任何进程访问。或者,您可以将其存储在单独的
gen_服务器
中,并在每次需要时向
gen_服务器
询问值。没有别的办法。Erlang被设计成一种函数式语言,不容易访问共享状态。函数只能使用已显式传递给它的数据或可以使用其他函数查询的数据(在本例中为
os:getenv
ets
、专用
genu server
或类似函数)。这当然适用于程序运行时读取的动态数据,而不是编译器已知的静态数据。
start(_StartType, _StartArgs) ->
    case get_cfg() of
        {error, _} = Err -> Err;
        Cfg -> start_sup(Cfg)
    end.

get_cfg() ->
    try
        hbd_cfg:setup()
    catch
        throw:Term -> {error, Term}
    end.

start_sup(Cfg) ->
    case hbd_sup:start_link(Cfg) of
        {ok, Pid} ->
            hbd_event_logger:add_handler(),
            {ok, Pid};
        Other ->
            {error, Other}
    end.