newbie, hash or 2dArry

Z

Zac Elston

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
 
S

Stefano Crocco

Alle venerd=C3=AC 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] =3D=3D> 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"]] =3D @query
h[host_to_query]["result"]] =3D 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 instanc=
es
variables (or use Struct or OpenStruct) and store query and result there. F=
or
instance, using OpenStruct:

require 'ostruct'

h[host_to_query] =3DOpenStruct.new:)query=3D> @query, :result=3D queryhost(=
host_to_query,@query)

then

h.each_value{|v| puts v.result}

=46or more information, you can look at the ri documentation for Hash, Stru=
ct=20
and OpenStruct (ri Hash, ri Struct, ri OpenStruct).

I hope this helps

Stefano
 
K

Keith Tom

Zac said:
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
 
R

Robert Klemme

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
 
Z

Zac Elston

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
 
Z

Zac Elston

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,527
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top