枚举过滤:包括索引 + 1 处的值
Enum Filtering: include value at index + 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
将新元素添加到累加器以避免创建许多后续链表路。)
我正在尝试从 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
将新元素添加到累加器以避免创建许多后续链表路。)