我有一个关于哈希访问的简单(我认为)问题。 我有以下哈希(获取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 :(
答案 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]