【发布时间】:2014-02-11 11:01:03
【问题描述】:
我已经完成perl 很长一段时间了,因此这让我在ruby 感到困惑。我正在从各个地方收集以下数据,并希望采用以下格式:
{
:"user_100" => {
:user_policy => [
"userpolicy_100",
"userpolicy_200"
],
:group_policy => [
"grouppolicy_300",
"grouppolicy_400"
],
},
:"user_200" => {
:user_policy => [
"userpolicy_300",
"userpolicy_400"
],
:group_policy => [
"grouppolicy_300",
"grouppolicy_400"
],
},
}
上面的结构是数组散列的散列,我只是无法在 ruby 中使用它。顺便说一句,我已经手动编写了上面的代码,因此可能存在语法错误。
我试过了:
hash = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }
但这只有在我有nested hashes 和no array 时才有效。
然后我尝试了:
hash = Hash.new{ |h,k| h[k] = [] }
但这仅适用于hash of arrays,不适用于hash of hash of array。
我需要在一个地方捕获这些数据,我想像上面代码 sn-p 中显示的那样以 perl 方式进行。
问题:
- 如何在 ruby 中创建
hash of hash of array? - 是否有更通用的方法来初始化任何深度嵌套的哈希/数组组合?
- 或者我的思维方式不是像 RUBY 那样,有没有更好的方法来解决我的基本问题?
更新:
这是我的实际代码:
array_users = Array.new
hash_user_polices = Hash.new{ |h,k| h[k] = [] }
iam = Aws::IAM.new
iam.list_users().each do |resp|
resp.users.each do |x|
array_users << x.user_name
end
end
array_users.each do |user|
iam.list_user_policies(:user_name => user).each do |resp|
resp.each do |x|
x.policy_names.each do |y|
hash_user_polices[:"#{user}"] << y.to_s
end
end
end
end
所以,
我得到用户列表并将其放入
array_users。然后我得到相应的用户策略,它们以array的形式返回(因此我正在迭代x.policy_names.each do |y|)。我真的很想拥有
hash_user_polices[:"#{user}"][:user_policy] << y.to_s。但由于我在 ruby 方面的专业知识有限,我只能在将
hash_user_polices[:"#{user}"] << y.to_s定义为hash_user_polices = Hash.new{ |h,k| h[k] = [] }后使其工作。我将编写一段单独的代码来获取 group_policies,因此当时我希望它有
hash_user_polices[:"#{user}"][:group_policy] << y.to_s。
简而言之,我在三个不同的 API 调用中获取 user list、user policy 和 group policy,并努力将这三个整合到一个地方,以便我能从中理解。
【问题讨论】:
-
这完全取决于数据源的结构。你能把它们也展示一下吗?
-
@BroiSatse,请查找更新。谢谢。
标签: perl ruby ruby arrays hash