Re: Perl arrays and hashes

  • From: "Octavian Rasnita" <orasnita@xxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Tue, 14 Oct 2008 14:12:59 +0300

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

Other related posts: