[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

newbie, hash or 2dArry

zac elston

3/30/2007 4:55:00 PM

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-....

5 Answers

Stefano Crocco

3/30/2007 5:05:00 PM

0

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

Keith Tom

3/30/2007 5:15:00 PM

0

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


Robert Klemme

3/30/2007 8:56:00 PM

0

On 30.03.2007 18:54, 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)

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

zac elston

4/5/2007 7:28:00 PM

0

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-....

zac elston

4/5/2007 10:15:00 PM

0

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-....