Global array

Hi,

Im trying to make an array a global array, but I cannot make it work.

Here is what I have:

hostname=server1
server = Hash.new { |hash, key| hash[key] = [] }
service_name=“service name”
service=service1

if server.key?(hostname)
server[hostname]=Hash.new { |hash, key| hash[key] = [] }
server[hostname][“service_name”]=Array.new
server[hostname][“service_name”]=“service#{service_counter}”
server[hostname][“service_name”]=[x,x,x]
end

I have tried with
$server[hostname][“service_name”]=[x,x,x]
$server[hostname][“service_name”]=Array.new

but that does not work… Any help is appreciated.

Kind Regards
Emil Enemkre

On Mon, Jan 16, 2012 at 3:17 PM, Emil E. [email protected]
wrote:

Hi,

Im trying to make an array a global array, but I cannot make it work.

“server” references a Hash.

Here is what I have:

hostname=server1
server = Hash.new { |hash, key| hash[key] = [] }
service_name=“service name”
service=service1

if server.key?(hostname)

Will likely return false because the Hash is empty initially.

server[hostname]=Hash.new { |hash, key| hash[key] = [] }
server[hostname][“service_name”]=Array.new
server[hostname][“service_name”]=“service#{service_counter}”
server[hostname][“service_name”]=[x,x,x]

The three lines above all overwrite the same entry. That’s almost
certainly not what you want.

end

I have tried with
$server[hostname][“service_name”]=[x,x,x]
$server[hostname][“service_name”]=Array.new

but that does not work… Any help is appreciated.

I am not 100% sure what you intend but I think you might just want

server = Hash.new { |hash, key| hash[key] = {} }
server[hostname][“service_name”] = [“service#{service_counter}”,
[x,x,x]]

Kind regards

robert

Hi,

On 16 Jan, 2012, at 16:19 , Robert K. wrote:

server = Hash.new { |hash, key| hash[key] = [] }
service_name=“service name”
service=service1

if server.key?(hostname)

Will likely return false because the Hash is empty initially.
That was the intention, if the hash is empty create it.


server[hostname][“service_name”] = [“service#{service_counter}”, [x,x,x]]

That is a much more elegant solution than mine, thanks.

But this does not solve my problem, I have the hash created within a
loop but are not able to access to array from outside that loop, due the
hash not being global. So how can I make the
server[hostname][“service_name”] = [“service#{service_counter}”,
[x,x,x]]
a global variable?

Kind Regards
Emil

On Wed, Jan 18, 2012 at 10:46 AM, Emil E. [email protected]
wrote:

That was the intention, if the hash is empty create it.
But this won’t work as intended: you create the Hash stored in
“server” with a block which creates Arrays internally. For that
mechanism to work you just access server[some_key] and work with what
you get. If you ask whether the key exists you always get false:

irb(main):001:0> server = Hash.new { |hash, key| hash[key] = [] }
=> {}
irb(main):002:0> key = “foo”
=> “foo”
irb(main):003:0> server.key? key
=> false
irb(main):004:0> server
=> {}
irb(main):005:0> server[key]
=> []
irb(main):006:0> server
=> {“foo”=>[]}
irb(main):007:0> server.key? key
=> true

And if you ask for the key then you need to take action if it is NOT
there but your code assigns only to server[hostname] if server.key?
hostname returned true. You need to at leas negate the condition.

That is a much more elegant solution than mine, thanks.

But this does not solve my problem, I have the hash created within a loop but
are not able to access to array from outside that loop, due the hash not being
global. So how can I make the
server[hostname][“service_name”] = [“service#{service_counter}”, [x,x,x]]
a global variable?

Prepend $.

Regards

robert