You can't assign an array to a hash key because that's how perl is done. :-)A hash key is a scalar, which it could be a string, a number, an array reference, a hash reference, a code reference... any kind of scalar.
And exactly like when you cannot assign an array to a string using $string = @array; you cannot assign that array to a hash key.If you assign an array to a hash key, the hash key will get only the first element of the list or array, like in the following example:
use strict; use warnings; my %hash = ( key => ('a', 'b', 'c'), ); print $hash{key}; This will print only "a". Octavian----- Original Message ----- From: "Sina Bahram" <sbahram@xxxxxxxxx>
To: <programmingblind@xxxxxxxxxxxxx> Sent: Tuesday, October 14, 2008 3:50 PM Subject: RE: Perl arrays and hashes
Thanks much. Is there a reason why you can not assign an array, rather thanan 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 RasnitaSent: Tuesday, October 14, 2008 7:13 AM To: programmingblind@xxxxxxxxxxxxx Subject: Re: Perl arrays and hashesThis 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 anarray 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 hashesI did understand all of that, but I suppose I was asking about why perl wastreating 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 OctavianRasnitaSent: 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 thishash, 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 thattheentire $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 hashesI'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 towhy perl isn't doing this automatically? Take care, Sina -----Original Message----- From: programmingblind-bounce@xxxxxxxxxxxxx [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of OctavianRasnitaSent: 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 hashesHi all, I have a very simple program that loops through a file, whose structureislike 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 thekeysof that hash, I get all the ip addresses I was looking for, but heavenforbidI try to get the values. That's an insane nightmare.How can I loop through that hash, with each key, looping through each ofthearrays stored at each key's index. After all, each key is an IP address,andeach IP address has a series of mac addresses associated with it in thisfile, 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 justit 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 thecontentsof 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 toloopthrough the array stored at @macs{$key}? Maybe I'm not doing this right up top? That's what I think the problemis.Somehow I've given my hash a reference to an array, rather than thearrayitself. 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