RE: Perl arrays and hashes

  • From: james.homme@xxxxxxxxxxxx
  • To: programmingblind@xxxxxxxxxxxxx
  • Date: Tue, 14 Oct 2008 09:29:26 -0400

Hi,
Perhaps I didn't read correctly, but I thought he said that you couldn't
assign an array to a key of a hash, but you can assign an array to a value
of a hash. I think this is like a Python or VbScript or JavaScript
dictionary.

Thanks.

Jim

James D Homme, Usability Engineering, Highmark Inc.,
james.homme@xxxxxxxxxxxx, 412-544-1810

"The difference between those who get what they wish for and those who
don't is action. Therefore, every action you take is a complete
success,regardless of the results." -- Jerrold Mundis
Highmark internal only: For usability and accessibility:
http://highwire.highmark.com/sites/iwov/hwt093/


                                                                           
             "Sina Bahram"                                                 
             <sbahram@xxxxxxxx                                             
             m>                                                         To 
             Sent by:                  programmingblind@xxxxxxxxxxxxx      
             programmingblind-                                          cc 
             bounce@freelists.                                             
             org                                                   Subject 
                                       RE: Perl arrays and hashes          
                                                                           
             10/14/2008 08:50                                              
             AM                                                            
                                                                           
                                                                           
             Please respond to                                             
             programmingblind@                                             
               freelists.org                                               
                                                                           
                                                                           




Thanks much. Is there a reason why you can not assign an array, rather than
an array reference, to an element of a hash?

Take care,
Sina

-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian
Rasnita
Sent: Tuesday, October 14, 2008 7:13 AM
To: programmingblind@xxxxxxxxxxxxx
Subject: Re: Perl arrays and hashes

This is because for any hash key you can have an array reference as a
value.
You can't have an array as a value for a hash key.

For example, you can't use something like:

%hash = (
key => (1, 2, 3),
);

but you need to use:

%hash = (
key => [1, 2, 3],
);

And when you use $hash{key} you will have the value of this key as a
result.
And that value is an array ref, not an array.

If you want to have the array for that ref, you need to dereference it,
putting the "@" sign before it like:

my $arrayref = [1, 2, 3];
my @array = @$arrayref;

So you need to use @$arrayref and not only @arrayref because there is no an
array with this name.

$arrayref is a scalar not an array. That scalar is a reference to an array.



Octavian

----- Original Message -----
From: "Sina Bahram" <sbahram@xxxxxxxxx>
To: <programmingblind@xxxxxxxxxxxxx>
Sent: Tuesday, October 14, 2008 9:00 AM
Subject: RE: Perl arrays and hashes


>I did understand all of that, but I suppose I was asking about why perl
was
> treating it as a reference rather than doing the conversion itself.
> Regardless though, it all works and thanks.
>
> Take care,
> Sina
>
> -----Original Message-----
> From: programmingblind-bounce@xxxxxxxxxxxxx
> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian
Rasnita
> Sent: Tuesday, October 14, 2008 1:35 AM
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: Perl arrays and hashes
>
> Hi,
>
> You need to write
>
> @{$macs{$key}}
>
> and not
>
> @macs{$key}
>
> because %macs is a hash and not an array to be noted with @ at the
> beginning.
>
> The %macs hash has a key named $key which happends to have an array as a
> value.
>
> So you first need to specify that you want to address the key $key of
this
> hash, using
>
> $macs{$key}
>
> and derefference it to get its value... the array, using @{$macs{$key}}
>
> It is just like when you use
>
> my $hash_key = $macs{$key};
> my @array = @$macs_key;
>
> Of course, you need to add more braces like when you use
> my @array = @{$hash_key};
> because $macs{$key} already contains braces and you need to specify that
the
> entire $macs{$key} is an array reference, not only $hash.
>
> Octavian
>
> ----- Original Message -----
> From: "Sina Bahram" <sbahram@xxxxxxxxx>
> To: <programmingblind@xxxxxxxxxxxxx>
> Sent: Monday, October 13, 2008 11:38 PM
> Subject: RE: Perl arrays and hashes
>
>
>> I'm off to try this out, but can you please explain why that is?
>>
>> I do understand why you're doing what you're doing, but I'm unclear as
to
>> why perl isn't doing this automatically?
>>
>> Take care,
>> Sina
>>
>>
>> -----Original Message-----
>> From: programmingblind-bounce@xxxxxxxxxxxxx
>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian
> Rasnita
>> Sent: Monday, October 13, 2008 4:24 PM
>> To: programmingblind@xxxxxxxxxxxxx
>> Subject: Re: Perl arrays and hashes
>>
>> Hi,
>>
>> You need to use:
>>
>> for my $key (sort(keys(%macs)))
>> {
>> print "$key\n";
>> for my $val (@{$macs{$key}})
>> {
>> print "$val\n";
>> }
>> print "\n";
>> }
>>
>> Octavian
>>
>> ----- Original Message -----
>> From: "Sina Bahram" <sbahram@xxxxxxxxx>
>> To: <programmingblind@xxxxxxxxxxxxx>
>> Sent: Monday, October 13, 2008 10:50 PM
>> Subject: Perl arrays and hashes
>>
>>
>>> Hi all,
>>>
>>> I have a very simple program that loops through a file, whose structure
> is
>>> like this.
>>>
>>> Key name:
>>> Value1
>>> Value2
>>> Value3
>>> ...
>>>
>>> Key name:
>>> Value1
>>> Value2
>>> .....
>>>
>>> Key name:
>>> Value1
>>> Value2
>>> Value3
>>> Value4
>>> ...
>>>
>>> And so on
>>>
>>> Not hard, right?
>>>
>>> I use the following snippet of code to parse that file.
>>>
>>> ***
>>>
>>> open(MACS, "macs.txt");
>>>
>>> my @macsFromFile = <MACS>;
>>> chomp @macsFromFile;
>>>
>>> my %macs;
>>> my $i = 0;
>>> for my $mac (@macsFromFile)
>>> {
>>> if($mac =~ /10.110.0.*/)
>>> {
>>> $key = $mac;
>>> $i = 0;
>>> @macs{$key} = ();
>>> }
>>>
>>> $macs{$key}[$i++] = $mac if($mac =~ /05:.*/);
>>> }
>>>
>>> ***
>>>
>>> Anyways, as far as I can tell, that works fine. When I print out the
keys
>
>>> of
>>> that hash, I get all the ip addresses I was looking for, but heaven
> forbid
>>
>>> I
>>> try to get the values. That's an insane nightmare.
>>>
>>> How can I loop through that hash, with each key, looping through each
of

>>> the
>>> arrays stored at each key's index. After all, each key is an IP
address,

>>> and
>>> each IP address has a series of mac addresses associated with it in
this
>>> file, in the form of them being in an array assigned to that key in the
>>> hash.
>>>
>>> So I wanted to make sure I parsed the file write. Thus, why not just
> print
>>> it out again and compare against the original. I tried the following.
>>>
>>> ***
>>>
>>> for my $key (sort(keys(%macs)))
>>> {
>>> print "$key\n";
>>> for my $val (@macs{$key})
>>> {
>>> print "$val\n";
>>> }
>>> print "\n";
>>> }
>>>
>>> ***
>>>
>>> It prints out a single memory address rather than the list of the
> contents
>>> of that array.
>>>
>>> Why does it do this?
>>>
>>> I am using a for each construct to itterate through an array, and I use

>>> the
>>> @ to indicate that I want array context to be used when I parse
>>> @macs{$key}
>>> ... What the heck else should I do to make perl understand I want to
loop
>>> through the array stored at @macs{$key}?
>>>
>>> Maybe I'm not doing this right up top? That's what I think the problem
> is.
>>> Somehow I've given my hash a reference to an array, rather than the
array
>>> itself.
>>>
>>> Help!
>>>
>>> Take care,
>>> Sina
>>>
>>> __________
>>> View the list's information and change your settings at
>>> //www.freelists.org/list/programmingblind
>>>
>>
>> __________
>> View the list's information and change your settings at
>> //www.freelists.org/list/programmingblind
>>
>> __________
>> View the list's information and change your settings at
>> //www.freelists.org/list/programmingblind
>>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind

__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind



__________
View the list's information and change your settings at 
//www.freelists.org/list/programmingblind

Other related posts: