list - 枚举过滤:在索引 + 1 处包含值
问题描述
我正在尝试从args
列表中解析 unix 样式的标志,即:
args = ["hello", "-f", "val", "-u", "valtwo"]
# Desired outcome: [{"-f", "val"}, {"-u", "valtwo"}]
我已经设法使用以下正则表达式提取标志:
args
|> Enum.filter(fn arg -> Regex.match?(~r/^-{1,2}\w+/, arg) end)
# ["-f", "-u"]
但是,为了获取与这些键对应的值,我需要在下一个索引处获取 args 的值。
我考虑过使用Enum.chunk_every(2)
(丢弃第一个元素"hello"
)来转换数组,但这不够灵活,因为这会破坏以下内容:
["hello", "-f", "val", "secondvalforf", "-u", "valtwo"]
# Achieved outcome: [{"-f", "val"}, {"secondvalforf", "-u"}, {"valtwo"}]
任何想法都非常感谢。
解决方案
Enum.reduce/3
是你的朋友吗?
args = ~w|hello -f val foo -u valtwo|
#⇒ ["hello", "-f", "val", "foo", "-u", "valtwo"]
Enum.reduce(args, [], fn
<<?-, _>> = key, args -> [{key, []} | args]
_, [] -> [] # skip plain arguments
arg, [{key, last} | rest] -> [{key, last ++ [arg]} | rest]
end)
#⇒ [{"-u", ["valtwo"]}, {"-f", ["val", "foo"]}]
调用Enum.reverse/1
结果以保留键的顺序(reduce
将新元素添加到累加器以避免在以后创建许多后续链表。)
推荐阅读
- python - 在 MECX 上检索钱包余额 - Python 中的 API 身份验证(签名)
- azure - 阻止端点接收大量不需要的第 3 方流量(类似探测)
- git - Git Stash 应用到本地分支的 Master 上
- grafana - 限制 grafana 用户创建任何新文件夹
- macros - 飞行中的Macropad?
- c++ - 为什么 std::round 提供返回 long 和 long long 的版本,而 std::floor、std::ceil、std::trunc 不提供?
- opencv - 安全视频流 - 受 IP 或设备限制
- android - 网络连接在本机反应中失败
- sql - 使用 row_number() 来自内部查询的 max(count)
- c# - C# JWT 令牌有空声明