I'm lost or just tired from guessing.
I need to make an hash I can call by hostname as the key and some random
amount of data after that as the values. now a hash works great for 1
to 1 maps (h[serverX] ==> result) but I need
h[serverX][query|result|time]
so how would I write a hash that would give me access to
in:
h[host_to_query]["query"]] = @query
h[host_to_query]["result"]] = queryhost(host_to_query,@query)
out:
for h.each |host| puts h[[host]["result"]]
thanks
zaq
···
--
Posted via http://www.ruby-forum.com/.
Alle venerdì 30 marzo 2007, Zac Elston ha scritto:
I'm lost or just tired from guessing.
I need to make an hash I can call by hostname as the key and some random
amount of data after that as the values. now a hash works great for 1
to 1 maps (h[serverX] ==> result) but I need
h[serverX][query|result|time]
so how would I write a hash that would give me access to
in:
h[host_to_query]["query"]] = @query
h[host_to_query]["result"]] = queryhost(host_to_query,@query)
out:
for h.each |host| puts h[[host]["result"]]
thanks
zaq
If I understand correctly, you can create a class with the required instances
variables (or use Struct or OpenStruct) and store query and result there. For
instance, using OpenStruct:
require 'ostruct'
h[host_to_query] =OpenStruct.new(:query=> @query, :result= queryhost(host_to_query,@query)
then
h.each_value{|v| puts v.result}
For more information, you can look at the ri documentation for Hash, Struct
and OpenStruct (ri Hash, ri Struct, ri OpenStruct).
I hope this helps
Stefano
Zac Elston wrote:
I'm lost or just tired from guessing.
I need to make an hash I can call by hostname as the key and some random
amount of data after that as the values. now a hash works great for 1
to 1 maps (h[serverX] ==> result) but I need
h[serverX][query|result|time]
so how would I write a hash that would give me access to
in:
h[host_to_query]["query"]] = @query
h[host_to_query]["result"]] = queryhost(host_to_query,@query)
out:
for h.each |host| puts h[[host]["result"]]
thanks
zaq
Hey Zac,
Would a nested hash do the trick?
hash = { :host1 => {
:query => @query,
:result => queryhost(...),
:time => time} }
then for output, you'd do something like
for hash.each_value do |value| puts value[:result] end
Hopefully that does the trick,
Keith
I'm lost or just tired from guessing.
I need to make an hash I can call by hostname as the key and some random
amount of data after that as the values. now a hash works great for 1
to 1 maps (h[serverX] ==> result) but I need
h[serverX][query|result|time]
so how would I write a hash that would give me access to
in:
h[host_to_query]["query"]] = @query
h[host_to_query]["result"]] = queryhost(host_to_query,@query)
This is syntactically incorrect since oyu have one closing bracket too much.
out:
for h.each |host| puts h[[host]["result"]]
Here's an alternative:
Info = Struct.new :query, :result, :time
h = Hash.new {|h,k| h[k] = Info.new}
h[serverX].query = @query
h[serverX].result = queryhost(host_to_query,@query)
h.each {|ho,inf| puts inf.result}
Of course you can use Arrays instead of Info but the code with Info is more readable and less error prone.
Kind regards
robert
···
On 30.03.2007 18:54, Zac Elston wrote:
first, thanks for the responses, ruby really is a great language.
My delima is that I'm trying to multithread the actions and store the
results in a hash with the hostname as key
to redefine the issue, for each host I need a thread and I expect a
result, then I'd like to be able to see the result in a
hash[host][result]
but I'm having trouble mixing the hash with the thread. maybe I'm going
about this all wrong. (this is outputting to a rails view, which is why
i have "@vars"
I have
@threads = []
@resulthash = Hash.new(0)
@hostarray.each do |host|
threads << Thread.new(host) do |myhost|
@resulthash = { :myhost => {
:packages => @mypackages,
:result => doXMLquery(host,@mypackages)} }
logger.info("host = " + host + ", result = " +
@resulthash[:myhost][:result])
end
end
@threads.each {|thr| thr.join }
logger.info("result of threads..")
@hostarray.each do |myhost|
logger.info("host = " + myhost + ", result = " +
@resulthash[:myhost][:result])
end
logger output
host = hostX, result = --data returned from hostX--
host = hostY, result = --data returned from hostY--
result of threads..
host = hostX, result = --data returned from hostY--
host = hostY, result = --data returned from hostY--
I'm clearly loosing context of the [:host][:result] in the final two
lines.
any pointers?
thanks
-zaq
···
--
Posted via http://www.ruby-forum.com/.
I used Openstruct and it appears to give me what I want. I'm still
interested in why a nested hash didn't work if anyone knows.
thanks again
-zaq
···
--
Posted via http://www.ruby-forum.com/.
I admit I didn't fully read the whole script, but I saw something that
looks wrong. A simple syntax mistake? See further down.
Zac Elston wrote:
first, thanks for the responses, ruby really is a great language.
My delima is that I'm trying to multithread the actions and store the
results in a hash with the hostname as key
to redefine the issue, for each host I need a thread and I expect a
result, then I'd like to be able to see the result in a
hash[host][result]
but I'm having trouble mixing the hash with the thread. maybe I'm going
about this all wrong. (this is outputting to a rails view, which is why
i have "@vars"
I have
@threads =
@resulthash = Hash.new(0)
@hostarray.each do |host|
threads << Thread.new(host) do |myhost|
Here, you are resetting @resulthash. Maybe you meant:
@resulthash[myhost] = {:packages => @mypackages,
:result => doXMLquery(host,@mypackages)}
···
@resulthash = { :myhost => {
:packages => @mypackages,
:result => doXMLquery(host,@mypackages)} }
logger.info("host = " + host + ", result = " +
@resulthash[:myhost][:result])
end
end
@threads.each {|thr| thr.join }
logger.info("result of threads..")
@hostarray.each do |myhost|
logger.info("host = " + myhost + ", result = " +
@resulthash[:myhost][:result])
end
logger output
host = hostX, result = --data returned from hostX--
host = hostY, result = --data returned from hostY--
result of threads..
host = hostX, result = --data returned from hostY--
host = hostY, result = --data returned from hostY--
I'm clearly loosing context of the [:host][:result] in the final two
lines.
any pointers?
thanks
-zaq