Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 从嵌套元组中获取值_Erlang_Tuples_Elixir - Fatal编程技术网

Erlang 从嵌套元组中获取值

Erlang 从嵌套元组中获取值,erlang,tuples,elixir,Erlang,Tuples,Elixir,下面是来自某个Erlang库的嵌套元组: tuple = {:Certificate, {:TBSCertificate, :v3, 3464270192823392628, {:AlgorithmIdentifier, {1, 2, 840, 113549, 1, 1, 11}, <<5, 0>>}, {:Validity, {:utcTime, '1604281

下面是来自某个Erlang库的嵌套元组:

tuple = {:Certificate,
          {:TBSCertificate,
           :v3,
           3464270192823392628,
           {:AlgorithmIdentifier, {1, 2, 840, 113549, 1, 1, 11}, <<5, 0>>},
           {:Validity, {:utcTime, '160428162930Z'}, {:utcTime, '170528162930Z'}},
           :asn1_NOVALUE,
           :asn1_NOVALUE,
           :asn1_NOVALUE,
           :asn1_NOVALUE,
           :asn1_NOVALUE}}
我可以进行模式匹配,但在 我只想忽略他们

在Erlang/Elixir中是否有其他方法可以获得嵌套的元组值?差不多

get_in(tuple, [:Certificate, :Validity])
{_,tbs_cert} = tuple,
validity = :TBSCertificate(tbs_cert, :Validity),
我找到了记录的定义
'TBSCertificate'

'TBSCertificate'{
      version,              % v1 | v2 | v3 
      serialNumber,         % integer() 
      signature,            % #'AlgorithmIdentifier'{} 
      issuer,               % {rdnSequence, [#AttributeTypeAndValue'{}]} 
      validity,             % #'Validity'{}
      subject,              % {rdnSequence, [#AttributeTypeAndValue'{}]} 
      subjectPublicKeyInfo, % #'SubjectPublicKeyInfo'{}
      issuerUniqueID,       % binary() | asn1_novalue
      subjectUniqueID,      % binary() | asn1_novalue
      extensions            % [#'Extension'{}] 
     }.
这是erlang符号,但我想它与elixir是等价的。在erlang中,您可以使用记录语法检索信息
'Validity'

{_,TBScert} = Tuple,
Validity = Tuple#'TBSCertificate'.'Validity' % which is also a record
我不熟悉长生不老药的语法,我认为它有点像

get_in(tuple, [:Certificate, :Validity])
{_,tbs_cert} = tuple,
validity = :TBSCertificate(tbs_cert, :Validity),
但我不能测试它。
“有效性”记录的定义是:

'Validity'{ 
      notBefore, % time()
      notAfter   % time()
     }.

我会这样做:

with {:Certificate, cert} <- tuple,
     [_, _, _, _, {:Validity, v1, v2} | _] <- Tuple.to_list(cert),
do: {v1, v2}
%⇒ {{:utcTime, '160428162930Z'}, {:utcTime, '170528162930Z'}}

使用{:Certificate,cert}您可以从
公钥.hrl

需要记录
Record.defrecord:certificate Record.extract(:证书,来自库:“public\u key/include/public\u key.hrl”)
Record.defrecord:TBSCertificate Record.extract(:TBSCertificate,来自库:“public\u key/include/public\u key.hrl”)
Record.defrecord:validity Record.extract(:validity,来自库:“public\u key/include/public\u key.hrl”)
然后您可以编写模式匹配

证书(tbsCertificate:TBSCert)=元组,
TBSCertificate(有效期:valid)=TBSCert,
有效期(不早于:从,不晚于:到)=有效,
我对长生不老药的了解还不够,不知道这是否也能奏效

certificate(tbsCertificate:tbsCertificate(有效期:有效期(notBefore:from,notAfter:to))=Tuple,

它看起来像一个Erlang记录,因此您可能应该使用elixir的
记录
模块,该模块将提供一些宏以便于访问:)元组结果来自,查看
记录。提取/2
,但在阅读文档后仍然不确定如何使用它。您使用的是哪个版本的Erlang?我本来打算用Record宏写一个答案,但看起来Erlang 19在TBSCertificate记录中的AlgorithmIdentifier之前有一个额外的字段。