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