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"}
所以在上面的 key
是 ca_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
的结果。
在下面的代码中,structList 是一个结构列表,每个 key
是模板中的一个字符串,value
是替换。
%ParamStruct{default: "Greater London", description: "Region",
key: "ca_cert_subj_state", label: "State/County", order: 99, required: false,
value: "Greater London"}
所以在上面的 key
是 ca_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
的结果。