Enum.reduce 和 String.replace 组合的正确公式是什么?

What is the right formula for this Enum.reduce and String.replace combination?

在下面的代码中,structList 是一个结构列表,每个 key 是模板中的一个字符串,value 是替换。

%ParamStruct{default: "Greater London", description: "Region",
 key: "ca_cert_subj_state", label: "State/County", order: 99, required: false,
 value: "Greater London"}

所以在上面的 keyca_cert_subj_state 并且值是 Greater London

这是进行替换的字符串:

sslCmd = """
openssl req -x509 -new -nodes -sha256 \
 -key {{key-file-pass}}.key \
 -days 3650 \
 -out {{key-file-pass}}.pem \
 -subj ""\
/C={{ca_cert_subj_country}}\
/ST={{ca_cert_subj_state}}\
/L={{ca_cert_subj_location}}\
/O={{ca_cert_subj_organization}}\
/OU={{ca_cert_subj_org_unit}}\
/CN={{ca_cert_subj_common_name}}\
/emailAddress={{ca_cert_email}}\
"""
Enum.reduce(structList, sslCmd, fn(x, sslCmd) -> sslCmd = String.replace(sslCmd, "{{#{x.key}}}", x.value)
  end)

此代码应该累积更改 sslCmd 中的字符串的结果,但显然不起作用。我不确定它应该如何递归或迭代。有什么想法吗?

我认为两个都命名为 sslCmd 的不同值之间存在混淆。 sslCmd 函数中的赋值也是多余的。

这是工作代码示例:

defmodule ParamStruct do
  defstruct default: nil, description: nil, key: nil, label: nil, order: nil, required: false, value: nil
end

structList = [
  %ParamStruct{default: "Greater London", description: "Region",
    key: "ca_cert_subj_state", label: "State/County", order: 99, required: false,
    value: "Greater London"},
  %ParamStruct{key: "ca_cert_subj_country", value: "United Kingdom"}
]

sslCmd = """
openssl req -x509 -new -nodes -sha256 \
 -key {{key-file-pass}}.key \
 -days 3650 \
 -out {{key-file-pass}}.pem \
 -subj ""\
/C={{ca_cert_subj_country}}\
/ST={{ca_cert_subj_state}}\
/L={{ca_cert_subj_location}}\
/O={{ca_cert_subj_organization}}\
/OU={{ca_cert_subj_org_unit}}\
/CN={{ca_cert_subj_common_name}}\
/emailAddress={{ca_cert_email}}\
"""

sslCmd = Enum.reduce(structList, sslCmd, fn(x, acc) -> 
    String.replace(acc, "{{#{x.key}}}", x.value) end)

请注意,sslCmd 被重新分配给 Enum.reduce/3 的结果。