Indeed, no disagreements from me on that example. Thanks much for the discussion. Take care, Sina -----Original Message----- From: programmingblind-bounce@xxxxxxxxxxxxx [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian Rasnita Sent: Tuesday, October 14, 2008 3:38 PM To: programmingblind@xxxxxxxxxxxxx Subject: Re: Perl arrays and hashes Well, and then how could you be able to get a list of values from a hash? For example, maybe you have a hash like: my %colors = ( white => '#ffffff', black => '#000000', red => '#ff0000', green => '#00ff00', blue => '#0000ff', ); And you want to get the array of values for the keys red, green and blue. You should use exactly the syntax you want to use for something else: my @values = @colors{('blue', 'red', 'green')}; Or if you want to put in @values the value for only white, you need to use: my @values = @colors{white}; And in this last case, the array @values will contain a single element, the value of the key "white". As a tip, when somebody needs to gets the values in an array this way, he doesn't usually create a common quoted list of keys, but uses the qw() function to create a list like: my @values = @colors{qw(blue green red)}; or more usually uses / as a delimiter and not params, like: my @values = @colors{qw/blue green red/}; When you have a multidimensional data structure like a hash of arrays, it is very normal to need specifying each level of the structure. Octavian ----- Original Message ----- From: "Sina Bahram" <sbahram@xxxxxxxxx> To: <programmingblind@xxxxxxxxxxxxx> Sent: Tuesday, October 14, 2008 9:06 PM Subject: RE: Perl arrays and hashes > But it should not do that. If I use { and }, it should immediatley realize > I'm speaking of a hash, and the @ sign should let it know I'm wanting to > dereference an array out of it. > > Take care, > Sina > > > -----Original Message----- > From: programmingblind-bounce@xxxxxxxxxxxxx > [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Octavian > Rasnita > Sent: Tuesday, October 14, 2008 1:40 PM > To: programmingblind@xxxxxxxxxxxxx > Subject: Re: Perl arrays and hashes > > If you use > > @colors{greys} > > perl thinks that you have an array named @colors, and if it is followed by > {...} it understands that you want to get the array of values for the > specified keys. > > > Octavian > > ----- Original Message ----- > From: "Sina Bahram" <sbahram@xxxxxxxxx> > To: <programmingblind@xxxxxxxxxxxxx> > Sent: Tuesday, October 14, 2008 5:04 PM > Subject: RE: Perl arrays and hashes > > >> But I wasn't assigning it to a key, only to the value stored at that >> key's >> index. >> >> For example. >> >> >> If I have %colors >> >> >> I would like to have >> >> @colors{darks} >> @colors{lights} >> @colors{greys} >> >> Where those are simply arrays, as I tried to symbolize by the at sign, >> which >> contain a list of colors of the given description. >> >> Instead, I'm lead to believe that I would have to do. >> >> >> @{$colors{"darks"}} >> >> Which is fine, but I'm just saying I think the previous syntax looks >> nicer. >> >> Take care, >> Sina >> >> -----Original Message----- >> From: programmingblind-bounce@xxxxxxxxxxxxx >> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of >> james.homme@xxxxxxxxxxxx >> Sent: Tuesday, October 14, 2008 9:29 AM >> To: programmingblind@xxxxxxxxxxxxx >> Subject: RE: Perl arrays and hashes >> >> 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 >> >> __________ >> 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