红宝石访问以变量为键的哈希

时间:2018-09-27 15:22:24

标签: ruby hash

我有一个关于哈希访问的简单(我认为)问题。 我有以下哈希(获取yml文件格式)

 {
   "all"=>   {
      "children"=> {
         "TSL-PCM-126"=>    {
            "children"=>  {
               "my_host-TSL-PCM-126"=> {
                  "hosts"=>   {
                     "TSF-W01"=> {
                        "ip"=>"192.168.0.201"
                     }
                  }
               }
            }
          }
      }
   }
}

我将主机名存储为变量

my_pc="#{`hostname`}" ==> my_pc="TSL-PCM-126"

我想访问正确的值,但使用my_pc变量作为键...

(库存=文件的Yaml加载量)

puts inventory["all"]["children"] ==> Work
puts inventory["all"]["children"]["TSL-PCM-126"] ==> Work 
puts inventory["all"]["children"]["#{my_pc}"] ==> NOK :( 

2 个答案:

答案 0 :(得分:1)

编辑OP后,使用

my_pc = `hostname`.strip

避免在字符串中使用换行符。

这确实按预期工作,

> my_pc
 => "TSL-PCM-126" 
> puts inventory["all"]["children"]["#{my_pc}"]
{"children"=>{"my_host-TSL-PCM-126"=>{"hosts"=>{"TSF-W01"=>{"ip"=>"192.168.0.201"}}

尽管您不需要字符串插值:

> inventory["all"]["children"][my_pc]
=> {"children"=>{"my_host-TSL-PCM-126"=>{"hosts"=>{"TSF-W01"=>{"ip"=>"192.168.0.201"}}}}}

您的变量/哈希中有错字,或者您正在尝试分配puts的返回值,即nil。

答案 1 :(得分:1)

当我输入

`hostname`

在我的PC上,我得到响应"dell\n"。关键是最后的\n。那是行字符的结尾。因此,我想知道在您的PC上它是否实际上正在返回my_pc="TSL-PCM-126\n"。如果仅使用puts进行检查,则行尾不会很明显。作为"TSL-PCM-126\n" != "TSL-PCM-126"的您没有按键匹配。

string method chomp将删除\n字符,并为您提供匹配的对象。所以:

puts inventory["all"]["children"][`hostname`.chomp]