Erlang 从嵌套元组中获取值
下面是来自某个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
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之前有一个额外的字段。