Newbie, hash or 2dArry

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

Alle venerdì 30 marzo 2007, Zac E. ha scritto:

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 E. wrote:

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

On 30.03.2007 18:54, Zac E. wrote:

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

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

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

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 E. wrote:

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)}