Ruby:将流程基础知识映射到哈希图

时间:2018-07-17 18:39:33

标签: ruby hashmap transformation

我有一个棘手的问题。我尝试将一些过程参数映射到Ruby中的哈希映射。我想比较参数(第一个示例)和配置文件(例如json-第二个示例)中的流程配置。

我有这样的东西:

/usr/bin/dockerd-current \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--seccomp-profile=/etc/docker/seccomp.json \
--selinux-enabled \
--storage-driver overlay2

我想要一个像这样的哈希图:

{ 
  'add-runtime' => {
     'docker-runc' => '/usr/libexec/docker/docker-runc-current'
  },
  'seccomp-profile' => '/etc/docker/seccomp.json',
  'selinux-enabled' => '',
  'storage-driver' => 'overlay2'
 }

编辑: 我制作了一个脚本,该脚本通常将参数映射到哈希图中。问题在于,该脚本无法正确检测和映射嵌套元素。这是我所拥有的:

params = "/usr/bin/dockerd-current     --add-runtime    docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2"

args = params.split("--")

# Remove process binary from args.
args.shift

# Remove multiple whitespaces and replace equals sign with single whitespace.
args.map! { |item| item.split.join(" ") }
args.map! { |item| item=item.gsub('=',' ') }

# Single word params implicit boolean flags with value true
# Adding true here.
args.map! do |item| 
  if item.split(" ").size == 1
    item+" true"
  else
    item
  end
end

# Map results to hashmap.
# TODO: substructures are not mapped properly... 
args.map! do |x|
  s = x.split(" ", 2)
  [s[0], s[1]]
end

puts args.to_h

我很高兴能提供任何帮助。

非常感谢!

1 个答案:

答案 0 :(得分:0)

如评论中所建议,https://docs.ruby-lang.org/en/2.1.0/OptionParser.html是必经之路。

建立您的选项哈希,然后(如果有的话,http://api.rubyonrails.org/v2.3/classes/ActiveSupport/CoreExtensions/Hash/Diff.html)对它们进行积极的支持,或者如果可能的话,将它们与hashdiff gem进行比较。如果所有其他方法均失败,则可以检查与右侧相比左侧的键,反之亦然。