Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Help with Hash Array

7 views
Skip to first unread message

ExecMan

unread,
Apr 30, 2012, 4:40:25 PM4/30/12
to
Hi,

I have a somewhat complex hash array, below. I want to know how to
access individual items within the inner hash.

With the example below, say I need the SUBJECT: $subj =
$SERVICES{'tactical'}->{subject};

However, say I need to get the COMMAND from the ALERT array with the
name SENDBUY. The value I am looking for is: trader.pl -B

But I am not sure how to turn the ALERT item into a hash so I can
access it by value, rather than by an array index.

Can anyone help??

%SERVICES = (
'tactical' => {
'service' => "tactical",
'url' => "tacticaltrader",
'from' => "Tactical Trader <tacticaltrader\@mail.com>",
'mailer' => "Tactical Trader Mailer",
'subject' => "Tactical Trader Summary",
'alert' => [
{ 'name' => "GENERATE", 'html' =>
"sid=group_id=29&ctype=0", 'command' => "eod-trader.pl -t -M",},
{ 'name' => "GENERATEBUY", 'html' =>
"sid=group_id=29&ctype=1", 'command' => "trader.pl -t -B -M",},
{ 'name' => "GENERATESELL", 'html' =>
"sid=group_id=29&ctype=2", 'command' => "trader.pl -t -S -M",},
{ 'name' => "SEND", 'html' =>
"sid=group_id=29&ctype=0", 'command' => "eod-trader.pl",},
{ 'name' => "SENDBUY", 'html' =>
"sid=group_id=29&ctype=1", 'command' => "trader.pl -B",},
{ 'name' => "SENDSELL", 'html' =>
"sid=group_id=29&ctype=2", 'command' => "trader.pl -S",},
{ 'name' => "GENERATEINTRA",'html' =>
"sid=group_id=29&ctype=3", 'command' => "trader.pl -t -I -M",},
{ 'name' => "SENDINTRA", 'html' =>
"sid=group_id=29&ctype=3", 'command' => "trader.pl",},
],
},
)

Rainer Weikusat

unread,
Apr 30, 2012, 5:10:00 PM4/30/12
to
ExecMan <artm...@yahoo.com> writes:
>
> I have a somewhat complex hash array, below. I want to know how to
> access individual items within the inner hash.
>
> With the example below, say I need the SUBJECT: $subj =
> $SERVICES{'tactical'}->{subject};
>
> However, say I need to get the COMMAND from the ALERT array with the
> name SENDBUY. The value I am looking for is: trader.pl -B
>
> But I am not sure how to turn the ALERT item into a hash so I can
> access it by value, rather than by an array index.

[see original for data structure]

Assuming you just want to search for first matching the alert:

-----------
# insert your definition here

sub search_alert
{
my ($srvs, $cmd) = @_;

$cmd eq $_->{name} and return $_
for (@{$srvs->{alert}});
}

$buy = search_alert($SERVICES{tactical}, 'SENDBUY');
print($buy->{command}, "\n") if $buy;
-----------

If you need to access alerts regularly both by position (or 'in
order') and by command/ name, you migh want to consider putting them
into the in-order 'alert array' and additionally, putting them into a
hash indexed by name. If you can have more then one pending alert
with a particular name, something more complicated would need to be
done here.

Example 'add an alert' routine for the simpler case (untested)

----------
sub add_alert
{
my ($alert, $srvs) = @_;

$srvs->{alerts_by_name}{$alert->{name}} = $alert;
push(@{$srvs->{alerts_in_order}}, $alert);
}
---------

J. Gleixner

unread,
Apr 30, 2012, 6:06:50 PM4/30/12
to
On 04/30/12 15:40, ExecMan wrote:
> Hi,
>
> I have a somewhat complex hash array, below. I want to know how to
> access individual items within the inner hash.
>
> With the example below, say I need the SUBJECT: $subj =
> $SERVICES{'tactical'}->{subject};

No need for the '->' there..

my $subj = $SERVICES{'tactical'}{ 'subject' };

>
> However, say I need to get the COMMAND from the ALERT array with the
> name SENDBUY. The value I am looking for is: trader.pl -B
>
> But I am not sure how to turn the ALERT item into a hash so I can
> access it by value, rather than by an array index.

You don't show how you're creating %SERVICES, however...

If the value for 'name' is *always* unique, then you could
use that value as a key, instead of storing things as an array. e.g.

$name = 'GENERATE';
$SERVICES{ 'tactical' }{ 'alert' }{ $name } = {
html => 'sid=group_id=29&ctype=0',
command => 'eod-trader.pl -t -M',
};

Which would let you access the various values directly:

print "command=",
$SERVICES{'tactical' }{ 'alert' }{ 'GENERATE' }{ 'command' },
"\n";


Using your current data structure it's not so bad...

use Data::Dumper;

for my $rec ( @{ $SERVICES{ 'tactical' }{ 'alert' } } )
{
if( $rec->{ 'name' } eq 'SENDBUY' )
{
print 'command = ', $rec->{ 'command' }, "\n";

J. Gleixner

unread,
Apr 30, 2012, 6:14:26 PM4/30/12
to
On 04/30/12 17:06, J. Gleixner wrote:
[...]
> Using your current data structure it's not so bad...
>
> use Data::Dumper;
^^^ Ignore that.. I meant to use that, to show the structure
of $rec, but figured showing the code to get the value might
be better.

ExecMan

unread,
May 1, 2012, 12:52:05 AM5/1/12
to
On Apr 30, 5:06 pm, "J. Gleixner" <glex_no-s...@qwest-spam-no.invalid>
wrote:
Well, it is only unique within each ALERT array. Each SERVICE,
although they have the same ALERT names, the values will be different
for HTML and COMMAND. How can I reference the ALERT part by a key for
the NAME?

Thanks!

J. Gleixner

unread,
May 1, 2012, 11:05:48 AM5/1/12
to
[...]
>
> Well, it is only unique within each ALERT array. Each SERVICE,
> although they have the same ALERT names, the values will be different
> for HTML and COMMAND. How can I reference the ALERT part by a key for
> the NAME?


That sounds fine. As I mentioned above...

As long as there isn't another 'name', that's the same, within alert..
e.g. if something like this doesn't happen:

>>> %SERVICES = (
>>> 'tactical' => {
>>> 'service' => "tactical",
>>> 'url' => "tacticaltrader",
>>> 'from' => "Tactical Trader<tacticaltrader\@mail.com>",
>>> 'mailer' => "Tactical Trader Mailer",
>>> 'subject' => "Tactical Trader Summary",
>>> 'alert' => [
>>> { 'name' => "GENERATE", 'html' =>
>>> "sid=group_id=29&ctype=0", 'command' => "eod-trader.pl -t -M",},
{ 'name' => "GENERATE", 'html' => "something",
'command' => "something",},

Then you can use what I posted. Use the value of what's in 'name'
( e.g. GENERATE ) as a key within the 'alert' hash, instead of an
array. Depending on what else you're doing, you might not need
the 'alert array', you need an 'alert hash', or you can make
another data structure... maybe 'alert_h' and store the name
as the key, as I showed above.

Try it and if you have questions, show how you're building %SERVICES.
It's probably a matter of changing a push, to do something like my
initial response.


0 new messages