accessing a hash

M

Michael Hill

I have this hash I'm trying to traverse and having some trouble.

my $var1 = {
'database' => {
'table' => {
'fields' => {
'field_name'
=> [

'A',

'B',

'C',

'D'

]
},
'name' => 'name of table'
}
}
};

This works:

print "$var1->{database}->{table}->{name}\n\n";

print "$var1->{database}->{table}->{fields}->{field_name}->[0]\n";
print "$var1->{database}->{table}->{fields}->{field_name}->[1]\n";
print "$var1->{database}->{table}->{fields}->{field_name}->[2]\n";

Now if I want to loop through all those in:
$var1->{database}->{table}->{fields}->{field_name} ?

I'm attempting to do this pointing directly to an array and loop through
the values but the error message says I am pointing to an element. How
do I point to the elements array?

foreach my $y ( keys %$var1->{database}->{table}->{fields}->{field_name}
)
{
print "$y\n";
}

Now if I force nested elements to be arrays .... like:

$var2 = {
'database' => [
{
'table' => [
{
'fields' => [
{

'field_name' => [

'A',

'B',

'C',

'D'

]
}
],
'name' => [
'name of
table'
]
}
]
}
]
};

This doesn't work anymore:

print "$var2->{database}->{table}->{name}\n\n";

print "$var2->{database}->{table}->{fields}->{field_name}->[0]\n";

Any how would I loop though the
$var2->{database}->{table}->{fields}->{field_name} elements array?

Thanks,

Mike
 
G

gnari

Michael Hill said:
Now if I force nested elements to be arrays .... like:

$var2 = {
'database' => [
{
'table' => [
{
'fields' => [
{

'field_name' => [

'A',
......


This doesn't work anymore:

print "$var2->{database}->{table}->{name}\n\n";
print "$var2->{database}[0]{table}[0]{fields}[0]{field_name}[0]\n\n";

should print 'A'

gnari
 
P

Paul Lalli

I have this hash I'm trying to traverse and having some trouble.

my $var1 = {
'database' => {
'table' => {
'fields' => {
'field_name'
=> [

'A',

'B',

'C',

'D'

]
},
'name' => 'name of table'
}
}
};

This works:

print "$var1->{database}->{table}->{name}\n\n";

print "$var1->{database}->{table}->{fields}->{field_name}->[0]\n";
print "$var1->{database}->{table}->{fields}->{field_name}->[1]\n";
print "$var1->{database}->{table}->{fields}->{field_name}->[2]\n";

Now if I want to loop through all those in:
$var1->{database}->{table}->{fields}->{field_name} ?

I'm attempting to do this pointing directly to an array and loop through
the values but the error message says I am pointing to an element. How
do I point to the elements array?

foreach my $y ( keys %$var1->{database}->{table}->{fields}->{field_name}
)
{
print "$y\n";
}
Your syntax is a bit off.

$var1->{database}->{table}->{fields}->{field_name} is an array reference.
Therefore:
@{$var1->{database}->{table}->{fields}->{field_name} is the array.


So you should have
foreach my $y (@{$var1->{database}->{table}->{fields}->{field_name}) {
print "$y\n";
}

Paul Lalli
 
D

David K. Wall

Michael Hill said:
I have this hash I'm trying to traverse and having some trouble.
[cleaned up for readability]

my $var1 = {
'database' => {
'table' => {
'fields' => {
'field_name' => ['A','B','C','D']
},
'name' => 'name of table'
}
}
};
This works:

print "$var1->{database}->{table}->{name}\n\n";

print "$var1->{database}->{table}->{fields}->{field_name}->[0]\n";
print "$var1->{database}->{table}->{fields}->{field_name}->[1]\n";
print "$var1->{database}->{table}->{fields}->{field_name}->[2]\n";


A little syntactic sugar:

print "$var1->{database}{table}{name}\n\n";

print "$var1->{database}{table}{fields}{field_name}[0]\n";
print "$var1->{database}{table}{fields}{field_name}[1]\n";
print "$var1->{database}{table}{fields}{field_name}[2]\n";

will work, and it's less typing.

The arrow is optional when it is between bracket subscripts.
Now if I want to loop through all those in:
$var1->{database}->{table}->{fields}->{field_name} ?

Tell perl it's (a reference to) an array by putting it inside @{}

for my $element ( @{ $var1->{database}{table}{fields}{field_name} } ) {
# do something with $element
}
Now if I force nested elements to be arrays .... like:

Um... this code just puts anomymous hashes inside anonymous arrays.
$var2 = {
'database' => [
{
'table' => [
{
'fields' => [
{

'field_name' => [


'A',


'B',


'C',


'D'


]
}
],
'name' => [
'name of
table'
]
}
]
}
]
};

Cleaned up a little:

$var2 = {
'database' => [{
'table' => [{
'fields' => [{
'field_name' => ['A','B','C','D']
}],
'name' => ['name of table']
}]
}]
};

Yeesh. I don't know what you were trying to do, but I very much doubt that
this code does it. :)

This doesn't work anymore:

print "$var2->{database}->{table}->{name}\n\n";

print "$var2->{database}->{table}->{fields}->{field_name}->[0]\n";

That's right, it doesn't, because $var is a reference to a different sort
of data structure than that referenced by $var1.

Any how would I loop though the
$var2->{database}->{table}->{fields}->{field_name} elements array?

There is no such thing as
$var2->{database}->{table}->{fields}->{field_name} so there's no way to
loop through it.
 
D

David K. Wall

David K. Wall said:
This doesn't work anymore:

print "$var2->{database}->{table}->{name}\n\n";

print "$var2->{database}->{table}->{fields}->{field_name}->[0]\n";

That's right, it doesn't, because $var is a reference to a different sort
of data structure than that referenced by $var1.

Oops, make that "$var2 is a ..."
 

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

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top