valavanp has asked for the wisdom of the Perl Monks concerning the following question:
Hi Monks,
when i push hash values in an array, it gets added. But when i push it through reference it is not getting added.
I am not giving the full code, only a part of it. Here is the code which i used, please correct me where i am wrong:
#!/usr/local/bin/perl
use strict;
use warnings;
%h=('1', 'one', '2', 'two', '3', 'three');
@arr=(1,2);
foreach $key(keys %h)
{
push(@arr,$h{$key});
}
print @arr;
@arr=(3,4,5);
foreach $key(keys %h)
{
push(@arr,$$h{$key});
print "@arr\n";
}
Re: pushing hash values to an array
by davorg (Chancellor) on Oct 16, 2006 at 11:24 UTC
|
Perhaps you should try fixing the errors that you get when running this code. With "use strict" enabled, this code doesn't run at all because you haven't declared any of your variables.
Once you've fixed those problems, you'll see that you are refering to a hash reference, $h which doesn't exist anywhere in your code.
--
< http://dave.org.uk>
"The first rule of Perl club is you do not talk about
Perl club." -- Chip Salzenberg
| [reply] [Watch: Dir/Any] |
Re: pushing hash values to an array
by blazar (Canon) on Oct 16, 2006 at 11:51 UTC
|
#!/usr/local/bin/perl
use strict;
use warnings;
%h=('1', 'one', '2', 'two', '3', 'three');
Since you're under strict this won't even compile.
@arr=(1,2);
Ditto! (But I won't insist further.)
foreach $key(keys %h)
{
push(@arr,$h{$key});
}
print @arr;
Thus is correct.
foreach $key(keys %h)
{
push(@arr,$$h{$key});
This is not. Why do you expect $h{$key} to be a scalar reference?
print "@arr\n";
}
You probably want to print out of the loop. Be careful (also) when preparing test examples.
All in all I suspect (but it's hard to tell from your description of the problem) you be in a situation in which you have $href=\%h or the like, and then
push @arr, $href->{$key};
is the way to go. | [reply] [Watch: Dir/Any] [d/l] [select] |
|
I am getting the hash reference values from the database through the keys of the hash values. I have a record with 3 fields in my backend. When i am retrieving the record with a particular field I am getting displayed only the number of fields, not the contents of the field which is 1,13 in this case(which are the actual values of the field). I am using these values in an combox box of a CGI application web page for multiple selection of an item. Only when i am pushing that hash values it is not getting displayed. In other areas, like retrieving rows it works fine. Please suggest me how can i proceed. I thank you for your suggestions.
| [reply] [Watch: Dir/Any] |
|
I still have some problems parsing your text. I understand that English may not be your mother tongue, it's not mine either. I feel like suggesting you to concentrate on the (possibly ) few relevant points with your issue and ignore anything else that may contribute the the noise/signal ratio of your post.
I am getting the hash reference values from the database through the keys of the hash values.
Ok, you have a hashref, period. You want to push its values into an array, right? Then the suggestion I gave you in my other reply should be fine. Did you try it? Does it work? Any inconvenience with it? Or else you may directly dereference the hashref as a whole and combine the two mentioned functions in one sweep:
push @array, values %$hashref;
I have a record with 3 fields in my backend.
[...]
Snip! | [reply] [Watch: Dir/Any] [d/l] [select] |
|
hi valavanp,
When you're not sure what sort of variable you have I find it useful to use Data::Dumper. When you know what is actually in it you have a better chance of extracting the data.
Show us the output of Data::Dumper and we'll be able to offer more help.
| [reply] [Watch: Dir/Any] |
Re: pushing hash values to an array
by Hofmator (Curate) on Oct 16, 2006 at 11:18 UTC
|
In these kind of cases it helps a lot if you tell us what you expected these statements to print and what they did print indeed. In this way we can deduct what you wanted to achieve - I, for example, have no clue what kind of behaviour you wanted to achieve with your code.
-- Hofmator
Code written by Hofmator and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.
| [reply] [Watch: Dir/Any] |
Re: pushing hash values to an array
by Anonymous Monk on Oct 16, 2006 at 11:38 UTC
|
| [reply] [Watch: Dir/Any] |
Re: pushing hash values to an array
by fenLisesi (Priest) on Oct 16, 2006 at 12:35 UTC
|
I am not sure what you are trying to do there, but you can start by cleaning up your code. Here is a sample attempt:
that prints:
1, 2, one, two, three
3, 4, 5, one, two, three
which is probably not what you wanted. I have the feeling that you want to print the spelling of the integers in the array, if they are available. If that is the case, then the following may give you some ideas:
You may have presumed that once you define a hash named %h, then a scalar named $h is automatically created and its value set to \%h, but that is not the case. You have to do that yourself.
Make sure your code compiles and runs before you post it.
It appears that the use strict; and use warnings; bits were added as accessories-after-the-fact. HTH.
Update: Added <readmore> | [reply] [Watch: Dir/Any] [d/l] [select] |
Re: pushing hash values to an array
by jwkrahn (Abbot) on Oct 16, 2006 at 15:22 UTC
|
push @arr, values %h;
If the values contain array references then:
push @arr, map @$_, values %h;
Or if the values contain hash references then:
push @arr, map %$_, values %h;
And if you don't know beforehand:
push @arr, map ref() eq 'ARRAY' ? @$_ : ref() eq 'HASH' ? %$_ : $_, va
+lues %h;
| [reply] [Watch: Dir/Any] [d/l] [select] |
|
|