Re: Perl arrays and hashes

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

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

Other related posts: