我正在寻找与 Clojure 中 Perl 的
unpack
功能等效的函数。
这里是一些示例 Perl 代码,说明了我想要完成的任务:
# get a 5-byte string, skip 3, then grab 2 8-byte strings, then the rest
($leading, $s1, $s2, $trailing) = unpack("A5 x3 A8 A8 A*", $data);
Clojure 中是否有相当于
unpack
的东西?
没有,也没有对应的
pack
。
我会使用正则表达式。虽然我无法真正说出替代方案的精确程度,因为我不了解 Perl 以及它如何处理字符串中的多字节字符。
;; If you prefer named groups.
(let [data "xxxxx___yyyyyyyyzzzzzzzz1234awerasdf"
pattern #"(?<leading>.{5}).{3}(?<s1>.{8})(?<s2>.{8})(?<trailing>.*)"
matcher (re-matcher pattern data)]
(re-find matcher)
(into {}
(map (fn [[n idx]]
[(keyword n) (.group matcher ^long idx)]))
(.namedGroups matcher)))
;; If you prefer to rely on positions.
(let [data "xxxxx___yyyyyyyyzzzzzzzz1234awerasdf"
pattern #"(.{5}).{3}(.{8})(.{8})(.*)"
[_ leading s1 s2 trailing] (re-matches pattern data)]
{:leading leading
:s1 s1
:s2 s2
:trailing trailing})