2017-04-16 6 views
0

structsのリストからその値を取得するこのエリクシールコードでString.replaceを呼び出しようとしていますが、実行時エラーが発生します。 String.replace機能へString.replace Enum.reduceでRuntimeErrorを発生させます

文字列パラメータは全てプリントアウトされており、それはすべて、通常のようです。なぜこうなった?

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


** (ArgumentError) argument error 
    (stdlib) binary.erl:275: :binary.replace/4 
    (elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (elixir) lib/code.ex:363: Code.require_file/2 

これは完全なコードです:ここでは、エラーを担当するラインです


defmodule ParamStruct do                               
    defstruct key: "", value: "", default: "", description: "description of parameter", label: "label on web form", required: false, order: 99  
end                                    

defmodule TemplateStruct do                              
    defstruct key: "must be unique", name: "descriptive name", code: "", executable: false, destination: "", delete_after: false,     
    perms: "644"                                 
end                                    

defmodule ProcessList do                               
    def parse_list([]), do: []                              

    def parse_list([%{"key" => ky,"value" => val,"default" => dft, "description" => desc,"label" => lbl} | tail]) do 
    [%ParamStruct{key: ky, value: val, description: desc, label: lbl, default: dft } | parse_list(tail) ] 
    end                                    

    def create_recommend_list(%{"itemScores" => score_list}) do                     
    parse_list(score_list)                              
    end                                    
end 

params = [                                  
%{"key" => "ca_cert_subj_state","value" => "Greater London","default" => "Greater London","description" => "Region","label" => "State/County"},     
    %{"key" => "key-file","value" => "cacert_001","default" => "cacert_001","description" => "","label" => "Key File (without password)"},     
    %{"key" => "key-file-pass","value" => "cacert_pass_001","default" => "cacert_pass_001","description" => "","label" => "Key File (with password)"},    
    %{"key" => "ca_cert_email","value" => "[email protected]","default" => "[email protected]","description" => "","label" => "Email"},        
    %{"key" => "ca_cert_subj_common_name","value" => "Elixir User","default" => "domain.net","description" => "","label" => "Common Name"},     
    %{"key" => "ca_cert_subj_country","value" => "UK","default" => "UK","description" => "Country","label" => "Country"},        
    %{"key" => "ca_cert_subj_location","value" => "Manchester","default" => "Westchester","description" => "","label" => "Location"},       
    %{"key" => "ca_cert_subj_organization","value" => "Elixir Programs Forum","default" => "Big Company","description" => "","label" => "Organisation"},     
    %{"key" => "ca_cert_subj_org_unit","value" => "IT Department","default" => "Infosystems and Communications","description" => "","label" => "Organisational Unit"}                                    
    ]   

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}}\ 

''' 
structList = ProcessList.parse_list(params) 
#IO.inspect ProcessList.parse_list(params) 
# [first | _ ] = ProcessList.parse_list(params) 
# IO.puts " #{first.key} is #{first.value} " 

# IO.inspect first 
IO.puts sslCmd 
IO.puts "list of keys and values" 
IO.puts "=======================" 
Enum.reduce(structList, sslCmd, fn(x, sslCmd) -> IO.puts " #{x.key} is #{x.value} " end) 

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

** (ArgumentError) argument error 
    (stdlib) binary.erl:275: :binary.replace/4 
    (elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3 
    (elixir) lib/code.ex:363: Code.require_file/2 

答えて

1

あなたの問題は、ここではそのですはChar List, not a Stringです。そのため、String.replace(これはStrings a.k.aバイナリのみで動作します)を呼び出すことができません。

最も簡単な解決策は、これにsslCmdの値を変更することです:

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}}\ 
""" 

(代わりに、単一のもの'''の二重引用符"""に注意してください)

+0

おかげ - 他の誰かがそれを言及したが、私はそれを考えました'String.replace'へのパラメータに適用されます。 String.replaceの匿名機能は、sslCmdが動作していないことを更新するはずです。これは不変性のためです。どのように再構成し、それを避けるためにどの変数を追加する必要がありますか? – vfclists

関連する問題